一道水题,居然改错改了一个多小时
题目的意思是其实就是找出一个单词,前半部是一个出现过的单词,后半部也是,记住,要严格满足这个条件
所以,其实也就是先查找一个单词的是否有前缀,再用这个单词除去前缀的部分查找是否存在一个这样的单词
虽然题目说按字典序输出,但本身已经是按字典序输入了,所以排序也就省了
#include<iostream> #include<string> using namespace std; struct node { int v; node *next[26]; }; node *root; char str[50002][50]; void insert(char *s) { node *p=root; for(;*s!='\0';s++) { int d=*s-'a'; if(p->next[d]==NULL) { p->next[d]=new node(); p=p->next[d]; } else p=p->next[d]; } // cout<<p->v<<endl; p->v=1; } int find2(char *s) { node *p=root; for(;*s!='\0';) { int d=*s-'a'; if(p->next[d]!=NULL) { p=p->next[d]; if(p->v==1&&*(s+1)=='\0')//这部分很关键,要严格满足 return 1; s++;//这里也是,即使上一步没找到,还得继续往下查找 } else return 0; } return 0; } int find(char *s) { node *p=root; for(;*s!='\0';) { int d=*s-'a'; p=p->next[d]; if(p!=NULL) { if(p->v==1&&find2(s+1))//用除去前缀剩下的部分在find2中查找 return 1; s++; } else return 0; } return 0; } int main() { int i=0,j; root=new node(); while(scanf("%s",str[i])!=EOF) { insert(str[i]); i++; } for(j=0;j<i;j++) { if(find(str[j])) { cout<<str[j]<<endl;; } } return 0; }