题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1247
题意:判断某个单词是否由另外两个单词拼接组成。
注意:这道题不需要按字典序输出!!!(虽然题目说了)
#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
typedef pair<int,int> P;
const int maxn=50005;
int T,n,m;
string s[maxn];
struct Trie{
Trie *next[26];
int v;
};
Trie *root;
void creatTrie(string s){//建树
Trie *p=root,*q;
int len=s.length();
for(int i=0;i<len;i++){
int id=s[i]-'a';
if(p->next[id]==NULL){
q=(Trie*)malloc(sizeof(Trie));
q->v=0;
for(int j=0;j<26;j++)
q->next[j]=NULL;
p->next[id]=q;
}
p=p->next[id];
}
p->v=-1;//-1做结束标识符
}
bool findTrie(string s){//查找字符串是否在字典树中
Trie *p=root;
int len=s.length();
for(int i=0;i<len;i++){
int id=s[i]-'a';
p=p->next[id];
if(p==NULL)
return false;
}
return p->v==-1;
}
void del(Trie *T){//释放
if(T==NULL)
return;
for(int i=0;i<26;i++){
if(T->next[i]!=NULL)
del(T->next[i]);
}
free(T);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
#endif
root=(Trie*)malloc(sizeof(Trie));//初始化
for(int i=0;i<26;i++)
root->next[i]=NULL;
int num=0;
while(cin>>s[num]){//建树
creatTrie(s[num]);
num++;
}
for(int i=0;i<num;i++){//查找
int len=s[i].length();
for(int j=1;j<=len-1;j++){
string str1=s[i].substr(0,j);
string str2=s[i].substr(j,len-j);
if(findTrie(str1)&&findTrie(str2)){
cout<<s[i]<<endl;
break;
}
}
}
del(root);
return 0;
}