#include"cstdio" #include"cstring" using namespace std; const int MAXN=50005; const int N=26; struct node{ bool val; node* next[N]; }; node* root; node memory[MAXN]; int ant; node* create() { node* p=&memory[ant++]; for(int i=0;i<N;i++) { p->next[i]=NULL; p->val=false; } return p; } void insert(char *s) { node* p=root; for(int i=0;s[i];i++) { int k=s[i]-‘a‘; if(p->next[k]==NULL) p->next[k]=create(); p=p->next[k]; } p->val=true;//若能走到最末端,则返回true; } bool search(char *s) { node* p=root; for(int i=0;s[i];i++) { int k=s[i]-‘a‘; if(p->next[k]==NULL) return false; p=p->next[k]; } return p->val;//若只是某个已插入单词的前缀,则返回false; } int main() { int cnt=0; root=create(); char word[MAXN][20]; while(scanf("%s",word[cnt])!=EOF) { //if(word[cnt][0]==‘0‘) break; insert(word[cnt]); cnt++; } for(int i=0;i<cnt;i++) { for(int j=1;word[i][j];j++) { char fr[20]={‘\0‘}; char re[20]={‘\0‘}; strncpy(fr,word[i],j); strncpy(re,word[i]+j,strlen(word[i])-j); if(search(fr)&&search(re)) { printf("%s\n",word[i]); break; } } } return 0; }
时间: 2024-10-29 19:09:56