一道水题,居然改错改了一个多小时
题目的意思是其实就是找出一个单词,前半部是一个出现过的单词,后半部也是,记住,要严格满足这个条件
所以,其实也就是先查找一个单词的是否有前缀,再用这个单词除去前缀的部分查找是否存在一个这样的单词
虽然题目说按字典序输出,但本身已经是按字典序输入了,所以排序也就省了
#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;
}