Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 21250 Accepted Submission(s): 7449
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<cstdlib> const int maxn=1000005; int trie[maxn][27]; int color[maxn]; int k=1; int cnt=0; char word[50005][50]; using namespace std; void _insert(char *w) { int p=0; int len=strlen(w); for(int i=0;i<len;i++) { int temp=w[i]-‘a‘; if(!trie[p][temp]) { trie[p][temp]=k++; } p=trie[p][temp]; } color[p]=1; } int query(char *w) { int p=0; int len=strlen(w); for(int i=0;i<len;i++) { int temp=w[i]-‘a‘; if(trie[p][temp]) { p=trie[p][temp]; if(color[p])//如果某个字符点是终结点,则从下一个字符组成的单词从树中查找。 { int pos=0; for(int j=i+1;j<len;j++) { int temp2=w[j]-‘a‘; if(!trie[pos][temp2]) { break; } pos=trie[pos][temp2]; if(j==len-1&&color[pos]==1) { return 1; } } } } else return 0; } return 0; } int main() { while(scanf("%s",word[cnt])!=EOF)//一开始的单词即为字典序输入,所以可以直接输出. { _insert(word[cnt]); cnt++; } for(int i=0;i<cnt;i++) { if(query(word[i])) { printf("%s\n",word[i]); } } }
原文:https://www.cnblogs.com/switch-waht/p/11519456.html