zoukankan      html  css  js  c++  java
  • day 1——字典树练习

    cojs 173. 词链

    ★☆   输入文件:link.in   输出文件:link.out   简单对比
    时间限制:1 s   内存限制:128 MB

    【问题描述】
    给定一个仅包含小写字母的英文单词表,其中每个单词最多包含 50 个字母。

    如果一张由一个词或多个词组成的表中,每个单词(除了最后一个)都是排在它后面的单词的前缀,则称此表为一个词链。例如下面的单词组成了一个词链:


    int 
    integer

    而下面的单词不组成词链:

    integer 
    intern

    请在给定的单词表中取出一些词,组成最长的词链。最长的词链就是包含单词数最多的词链。

    数据保证给定的单词表中,单词互不相同,并且单词按字典顺序排列。

    【输入格式】

    第一行一个整数 n ,表示单词表中单词数。

    下接 n 行每行一个单词。

    【输出格式】

    一个整数,表示最长词链长度。

    【输入输出样例】 
    输入:
    link.in
    5
    i
    int
    integer
    intern
    internet

    输出:
    link.out
    4

    【数据范围】

    50% 的数据, n<=1000

    100% 的数据, n<=10000

    #include<iostream>
    using namespace std;
    #include<cstdio>
    #include<cstring>
    #define N 10100
    int n;
    int ans=0;
    int topt=0;
    #define L 51
    struct Trie{
        int nxt[26];
        int cnt;
    }trie[L];
    void dfs(int k,int pre_ans)
    {
        for(int i=0;i<26;++i)
          if(trie[k].nxt[i])
          {
              dfs(trie[k].nxt[i],pre_ans+trie[k].cnt);       //在树的一条边上深搜,看一条边上最多的标示符是出现了几次,这就是最长的链表 
          }
        ans=max(pre_ans+trie[k].cnt,ans);                    //取大 
    }
    void build(char *str)//建立一个单词的树 
    {
        int now=0;
        while(*str)
        {
            if(!trie[now].nxt[*str-'a'])        //now储存当前在第几行,str指针指向单词的第0~strlen(s)个元素,nxt[0~25]代表a,b,c……x,y,z在本行有没有出现过 
    		                                    // 如果没有的话就建立一棵新树,有的话就继续往下走 
            trie[now].nxt[*str-'a']=++topt;
            now=trie[now].nxt[*str-'a'];
            str++;
        }
        trie[now].cnt++;                        //只在单词的末尾加一个标识符 
    }
    void input()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;++i)
        {
            char s[L];
            scanf("%s",s);
            build(s);
        }
        dfs(0,0);
        printf("%d
    ",ans);
    }
    int main()
    {
        freopen("link.in","r",stdin);
    //    freopen("link.out","w",stdout);
        input();
    //    fclose(stdin);fclose(stdout);
        return 0;
    }
    

      

  • 相关阅读:
    五一集训——图论
    Luogu P3942 将军令
    8.14 Round 1
    8.10 Round 1
    8.9 Round 1
    8.7 Round 2
    8.7 Round 1
    8.6 Round 1
    8.5 Round 2
    FHQ-Treap
  • 原文地址:https://www.cnblogs.com/yuemo/p/5491827.html
Copyright © 2011-2022 走看看