zoukankan      html  css  js  c++  java
  • Shortest Prefixes(poj 2001)

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

    /*
      字典树
      在裸字典树的基础上,设置一个sum数组,sum[i]表示i这个节点被用过几次,当我们扫一个单词时,
      如果它的某一个字母只用过一次,即只有它用过,那么这以前就是它的前缀。 
    */
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #define N 21
    #define M 1010
    using namespace std;
    int trie[M*N][27],sum[M*N],n,tot=1;
    char s[M][N];
    void build(int num,int rt)
    {
        int len=strlen(s[num]);
        for(int i=0;i<len;i++)
        {
            int x=(int)s[num][i]-'0'+1;
            if(!trie[rt][x])trie[rt][x]=++tot;
            rt=trie[rt][x];
            sum[rt]++;
        }
    }
    void query(int num,int rt)
    {
        int len=strlen(s[num]);
        for(int i=0;i<len;i++)
        {
            int x=(int)s[num][i]-'0'+1;
            rt=trie[rt][x];
            cout<<s[num][i];
            if(sum[rt]==1)break;
        }
    }
    int main()
    {
        while(scanf("%s",s[++n])!=EOF)
        {
            build(n,1);
        }
        n--;
        for(int i=1;i<=n;i++)
        {
            printf("%s ",s[i]);
            query(i,1);
            printf("
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    c++类的知识点(1)
    并查集经典例题分析
    并查集
    bfs-迷宫
    出栈次序--数学归纳法--蓝桥
    九宫重排
    Tomcat详解
    寒假日记-第三天
    寒假日记-第二天(MySQL语句)
    Java学期总结
  • 原文地址:https://www.cnblogs.com/harden/p/5862526.html
Copyright © 2011-2022 走看看