这一题也是用字典树做,思路比较简单,就是分两部分查找。左边一部分,右边一部分。
这一题最主要的就是要注意结束条件。在Insert时候,要标记Insert单词的最后一个字母,一次来方便后面的search。
#include <iostream>
using namespace std;
#define MAX 26
typedef struct Trie
{
int count;
Trie *next[MAX];
}Trie;
char a[50001][50];
Trie *root;
void Insert(char *s)
{
Trie *p=root;
int i=0,k;
while(s[i])
{
k=s[i++]-'a';
if(p->next[k]==NULL)
{
p->next[k]=new Trie();
}
p=p->next[k];
}
p->count=1;
}
int search_right(char *s)
{
Trie *p=root;
int i=0,k;
while(s[i])
{
k=s[i++]-'a';
if(p->next[k]!=NULL)
{
if(p->next[k]->count==1 && s[i]=='\0')
return 1;
p=p->next[k];
}
else
return 0;
}
return 0;
}
int search(char *s)
{
Trie *p=root;
int i=0,k;
while(s[i])
{
k=s[i++]-'a';
p=p->next[k];
if(p!=NULL && p->count ==1 && search_right(s+i))
{
return 1;
}
}
return 0;
}
int main()
{
Trie *p;
int k=0,i=0;
char s[50];
root=new Trie();
while(gets(a[k]))
{
Insert(a[k]);
k++;
}
while(i<k)
{
if(search(a[i]))
{
printf("%s\n",a[i]);
}
i++;
}
return 0;
}