找唯一能识别字符串的前缀
#include<stdio.h>
#include<string.h>
#define MAXN 20005
struct trie
{
int ch[MAXN][26];
int val[MAXN];
int sz;
void ini() {sz=1;memset(ch[0],0,sizeof(ch[0]));}
int get_id(char c) {return c-'a';}
int i,j;
void insert(char *s)
{
int len=strlen(s),pre=0,next;
for(i=0;i<len;i++)
{
next=get_id(s[i]);
if(!ch[pre][next])
{
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
ch[pre][next]=sz++;
}
pre=ch[pre][next];
val[pre]++;
}
}
void query(char *s)
{
int len=strlen(s),pre=0,next;
for(i=0;i<len;i++)
{
next=get_id(s[i]);
printf("%c",s[i]);
if(val[ch[pre][next]]==1) return ;
pre=ch[pre][next];
}
}
};
char s[1005][25];
trie t;
int main()
{
t.ini();
int i,n=0;
while(scanf("%s",s[n])!=EOF)
{
t.insert(s[n++]);
}
for(i=0;i<n;i++)
{
printf("%s ",s[i]);
t.query(s[i]);
printf("\n");
}
return 0;
}