字典树查询单词
题意给你一些字符串,找出能够唯一标识这个字符串的最短前缀
思路:先把字符串全部存进字典树,依次查找,依次输出,如果该字符出现的次数为1,则停止输出
详情见代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxn 110000
char str[maxn][40];
int vis[maxn];
int cur=1;
struct node
{
int num;
int next[30];
void init()
{
num=0;
memset(next,-1,sizeof(next));
}
}trie[maxn];
void insert(char *s,int len)
{
int p=0;
for(int i=0; i<len; i++)
{
int x=s[i]-'a';
if(trie[p].next[x]==-1)
{
trie[cur].init();
trie[p].next[x]=cur++;
}
p=trie[p].next[x];
trie[p].num++;
}
}
int find(char *s,int len)
{
int p=0;
for(int i=0; i<len; i++)
{
printf("%c",s[i]);
int x=s[i]-'a';
p=trie[p].next[x];
if(trie[p].num==1)break;//判断该字符只出现过一次
}
}
int main()
{
int n=0;
trie[0].init();
while(scanf("%s",str[n])!=EOF)
{
int len=strlen(str[n]);
vis[n]=len;
insert(str[n],len);
n++;
}
for(int i=0; i<n; i++)
{
printf("%s ",str[i]);
find(str[i],vis[i]);
printf("\n");
}
return 0;
}