题目:http://acm.hdu.edu.cn/showproblem.php?pid=1247
题意:给你一些单词,输出是由两个其他的单词组成的单词。
分析:trie树的入门题,很简单,这题的数据很水,每个单词的长度不会超过26.
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=50005;
char word[N][27];
struct node
{
bool ok;
node *next[26];
node()
{
ok=false;
memset(next,0,sizeof(next));
}
};
void Insert(node *rt,char *s)
{
int i=0;
node *p=rt;
while(s[i]){
int k=s[i++]-'a';
if(p->next[k]==NULL)
p->next[k]=new node();
p=p->next[k];
}
p->ok=true;
}
bool Search(node *rt,char s[])
{
int i=0,top=0,sta[27];
node *p=rt;
while(s[i]){
int k=s[i++]-'a';
if(p->next[k]==NULL)return 0;
p=p->next[k];
if(p->ok&&s[i])sta[top++]=i;
}
while(top){
bool flag=1;
i=sta[--top];
p=rt;
while(s[i]){
int k=s[i++]-'a';
if(p->next[k]==NULL){
flag=0;break;
}
p=p->next[k];
}
if(flag&&p->ok)return true;
}
return 0;
}
int main()
{
int n=0;
//freopen("f.txt","r",stdin);
node *rt=new node();
while(gets(word[n])){
Insert(rt,word[n]);
n++;
}
for(int i=0;i<n;i++){
if(Search(rt,word[i]))
printf("%s\n",word[i]);
}
return 0;
}
这题用map的话也可以,每次把一个单词分成两部分,分别用map判断是否两部分存在。时间复杂度n*(单词长度)*n(logn),有点大,但是数据比较弱,随便水水还是可以的。
#include<iostream>
#include<cstdio>
#include<map>
#include<string>
using namespace std;
map<string,bool>a;
string s[50005];
int main()
{
int t=0;
//freopen("f.txt","r",stdin);
while(cin>>s[t]){
a[s[t]]=true;
t++;
}
for(int i=0;i<t;i++){
int n=s[i].size();
for(int j=1;j<n;j++){
string s1(s[i],0,j);
string s2(s[i],j);
if(a[s1]&&a[s2]){
cout<<s[i]<<endl;break;
}
}
}
return 0;
}