找唯一能识别字符串的前缀
#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;
}
本文介绍了解决POJ2001问题的方法,通过使用Trie树来查找每条输入字符串的最短唯一前缀。代码实现了Trie树的插入和查询操作,确保每个字符串都有一个唯一的最短前缀。
514

被折叠的 条评论
为什么被折叠?



