POJ 2001 Shortest Prefixes(Trie)

 

 给出多组字符串,求每一个字符串可以唯一表示的前缀

利用字典树,对于每一个前缀标记出现的次数,遇到前缀出现次数为 1 时返回 

const int N=2e4+5;

    int n,m;
    int i,j,k;
    char s[N][25];
    int t[N][26];
    int sum[N],tot=0;

int idx(char ch){ return ch-'a'; }

void insert(char *s,int rt)
{
    for(int i=0;s[i];i++){
        int x=idx(s[i]);
        if(!t[rt][x]) t[rt][x]=++tot;
        sum[t[rt][x]]++;
        rt=t[rt][x];
    }
}

string find(char *s,int rt)
{
    string ans="";
    for(int i=0;s[i];i++){
        int x=idx(s[i]);
        rt=t[rt][x];
        ans+=s[i];
        if(sum[rt]==1) return ans;
    }
    return ans;
}

int main()
{
    //IOS;
    int num=0;
    while(~ss(s[++num])){
        insert(s[num],0);
    }
    //dbg(sum[0]);
    for(int i=1;i<=num;i++){
        printf("%s %s\n",s[i],find(s[i],0).c_str());
        //cout<<s[i]<<" "<<find(s[i],0)<<endl;
    }
    PAUSE;
    return 0;
}

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页