题目链接:poj2001
题目大意:给出一些字符串 ,求最短的区别前缀(即这个前缀是独一无二的且要尽可能小)
思路:只要在字典树上记录所有的节点的记录次数,这个时候只要查到一个次数只有1的时候就可以了。
因为1的是时候说明只有一个单词的前缀经过。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
node *nxt[26];
int flag;
node()//构造函数
{
for(int i=0;i<26;i++)
{
nxt[i]=NULL;
}
flag=0;
}
};
node * root;
void init()//初始化根节点
{
root=new node();
}
void ins (char *s)
{
int len=strlen(s);
node *now=root;//指向根节点
for(int i=0;i<len;i++)
{
int to=s[i]-'a';
if(now->nxt[to]==NULL)now->nxt[to]=new node();
now=now->nxt[to];//now指向新生成的结点
now->flag++;
}
}
int fid (char *s)
{
int len=strlen(s);
node *now=root;//指向根节点
for(int i=0;i<len;i++)
{
int to=s[i]-'a';
if(now->nxt[to]==NULL)return -1;
now=now->nxt[to];//now指向新生成的结点
if(now->flag==1)return i;
}
return len-1;
}
char s[1100][25];
int main()
{
init();
int cnt=0;
while(~scanf("%s",s[cnt]))
{
ins(s[cnt]);
cnt++;
}
for(int i=0;i<cnt;i++)
{
int ans=fid(s[i]);
printf("%s ",s[i]);
for(int j=0;j<=ans;j++)
printf("%c",s[i][j]);
printf("\n");
}
return 0;
}