zoukankan      html  css  js  c++  java
  • POJ2001 Shortest Prefixes(字典树)

    题意:给出n个单词(1<=n<=1000),求出每个单词的非公共前缀,如果没有,则输出自己。

    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<vector>
    #include<stack>
    #include<cmath>
    #include<queue>
    #include<map>
    using namespace std;
    struct Node
    {
        int c;
        int next[26];
    } node[20005];
    int cnt;
    int newnode()
    {
        ++cnt;
        node[cnt].c=0;
        for(int i=0; i<26; i++)
            node[cnt].next[i]=-1;
        return cnt;
    }
    char s[1006][25];
    int len[1006];
    void insert(int rt,int tt,int now)
    {
        if(now>len[tt])return;
        int p=s[tt][now]-'a';
    
        if(node[rt].next[p]==-1)
        {
            int l=newnode();
            node[rt].next[p]=l;
            node[l].c+=1;
    
            insert(l,tt,now+1);
        }
        else
        {
            int l=node[rt].next[p];
            node[l].c+=1;
    
            insert(l,tt,now+1);
        }
    }
    void print(int rt,int tt,int now)
    {
       if(now>len[tt])return;
       printf("%c",s[tt][now]);
       if(node[rt].c==1)return;
       int p=s[tt][now+1]-'a';
       print(node[rt].next[p],tt,now+1);
    }
    int main()
    {
        int k=0;
        cnt=0;
        node[0].c=0;
        for(int i=0;i<26;i++)
        node[0].next[i]=-1;
        while(~scanf("%s",s[++k]+1))
        {
            len[k]=strlen(s[k]+1);
            insert(0,k,1);
           
        }
        for(int i=1;i<=k;++i)
        {
           printf("%s ",s[i]+1);
           int p=s[i][1]-'a';
           print(node[0].next[p],i,1);
           printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    Beta冲刺——星期四
    Beta冲刺——星期三
    团队学期总结
    Beta版本发布
    第三天Beta冲刺
    第二天Beta冲刺
    第一天Beta冲刺
    个人作业——Alpha项目测试
    第四次团队作业
    第三次团队作业
  • 原文地址:https://www.cnblogs.com/d-e-v-i-l/p/4928141.html
Copyright © 2011-2022 走看看