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

浙公网安备 33010602011771号