这个题,是将一个字符串拆开进字典树。这个还是蛮经典的。 其中也有点需要注意的地方 代码
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; #define maxn 26 typedef struct Trie { int v; Trie *next[maxn]; }; char s[50005][120]; Trie *root; void create(char *str) { int len=strlen(str); Trie *p=root,*q; for(int i=0;i<len;i++) { int id=str[i]-'a'; if(p->next[id]==NULL) { q=new Trie; q->v=0; for(int j=0;j<maxn;j++) q->next[j]=NULL; p->next[id]=q; p=p->next[id]; } else { p=p->next[id]; } } p->v=1; } int findT(char *str) { int len = strlen(str); Trie *p=root; for(int i=0;i<len;i++) { int id= str[i]-'a'; if(p->next[id]==NULL) return 0; p=p->next[id]; } return p->v; } int main() { int num=0; root=new Trie; root->v=0; for(int h=0;h<maxn;h++) root->next[h]=NULL; while(scanf("%s",s[num])!=EOF) { create(s[num]); num++; } char a[120],b[120]; for(int j=0;j<num;j++) { int len=strlen(s[j]); for(int k=0;k<len;k++) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); strncpy(a,s[j],k); strncpy(b,s[j]+k,len-k); if(findT(a)==1&&findT(b)==1) { printf("%s\n",s[j]); break;//这里的break如果不加的话,同一个字符串可能输出两次。 } } } return 0; }