poj 2001 shortest prefixes

题目大意:

n个字符串,求它们与其他字符串不同的最短前缀,如果这个字符串是其他字符串的前缀,输出它本身

思路:

字典树

字典树存一下,看什么时候该节点只有一个串了就好了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
char wd[1010][25];
int t,cnt,tr[301010][30],s[301010];
void insert(int i)
{
    int len=strlen(wd[i]),k,pos=0;
    for(int j=0;j<len;j++)
    {
        k=wd[i][j]-'a';
        if(tr[pos][k]==0) tr[pos][k]=++t;
        pos=tr[pos][k];
        s[pos]++;
    }
}
void ask(int i)
{
    int len=strlen(wd[i]),k,pos=0;
    printf("%s ",wd[i]);
    for(int j=0;j<len;j++)
    {
        if(s[pos]==1) break;
        k=wd[i][j]-'a';
        printf("%c",wd[i][j]);
        pos=tr[pos][k];
    }
}
int main()
{
    while(scanf("%s",wd[cnt++])!=EOF) insert(cnt-1);
    for(int i=0;i<cnt;i++)
    {
        ask(i);printf("\n");
    }
}
View Code

 

posted @ 2017-07-23 13:07  jack_yyc  阅读(136)  评论(0编辑  收藏  举报