poj 2001 Shortest Prefixes

// 题意: 输入一些字符串,求每个字符串的最短非公共前缀,若没有则输出自身

#include <iostream> //trie树
#include <string>
using namespace std ;
struct Node
{
int next[26];
int cnt;
}table[20100];
char str[1000][22];
int tot,cur;
void init()
{
memset(table[0].next,-1,sizeof(table[0].next));
cur=1;
tot=0;
}
void insert(char ch[])
{
Node *p=&table[0];
for(int i=0;ch[i];++i)
{
int j=ch[i]-'a';
if(p->next[j]==-1)
{
p->next[j]=cur++;
Node* q=&table[p->next[j]];
for(int k=0;k<26;++k)
q->next[k]=-1;
q->cnt=1; //第1次出现
}
else
{
Node* q=&table[p->next[j]];
q->cnt++;
}
p=&table[p->next[j]];
}
}
void prefix(char ch[])
{
Node *p=&table[0];
for(int i=0;ch[i];++i)
{
printf("%c",ch[i]);
int j=ch[i]-'a';
p=&table[p->next[j]];
if(p->cnt==1) //找到最短有效前缀
break;
}
}
int main()
{
init();
while(scanf("%s",str[tot])!=EOF)
{
insert(str[tot]);
tot++;
}
for(int i=0;i<tot;++i)
{
printf("%s ",str[i]);
prefix(str[i]);
if(i<tot-1)
printf("\n");
}
return 0 ;
}

posted on 2011-07-22 14:56  sysu_mjc  阅读(178)  评论(0编辑  收藏  举报

导航