zoukankan      html  css  js  c++  java
  • tyvj1113 魔族密码

    描述

        风之子刚走进他的考场,就……
        花花:当当当当~~偶是魅力女皇——花花!!^^(华丽出场,礼炮,鲜花)
        风之子:我呕……(杀死人的眼神)快说题目!否则……-_-###
        花花:……咦~~好冷~~我们现在要解决的是魔族的密码问题(自我陶醉:搞不好魔族里面还会有人用密码给我和菜虫写情书咧,哦活活,当然是给我的比较多拉*^_^*)。魔族现在使用一种新型的密码系统。每一个密码都是一个给定的仅包含小写字母的英文单词表,每个单词至少包含1个字母,至多75个字母。如果在一个由一个词或多个词组成的表中,除了最后一个以外,每个单词都被其后的一个单词所包含,即前一个单词是后一个单词的前缀,则称词表为一个词链。例如下面单词组成了一个词链:
        i
        int
        integer
        但下面的单词不组成词链:
        integer
        intern
        现在你要做的就是在一个给定的单词表中取出一些词,组成最长的词链,就是包含单词数最多的词链。将它的单词数统计出来,就得到密码了。
        风之子:密码就是最长词链所包括的单词数阿……
        花花:活活活,还有,这些文件的格式是,第一行为单词表中的单词数N(1<=N<=2000),下面每一行有一个单词,按字典顺序排列,中间也没有重复的单词咧!!你要提交的文件中只要在第一行输出密码就行啦^^看你长得还不错,给你一个样例吧:

    输入格式

    第一行为单词表中的单词数N(1<=N<=2000),下面每一行有一个单词,按字典顺序排列,中间也没有重复的单词咧!!

    输出格式

    一个数,所得到的密码

    测试样例1

    输入



    int 
    integer 
    intern 
    internet

    输出

    4
    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    using namespace std;
    struct dat{
        int Hash;
        int id;
    }tmp;
    const int sed = 31,Sed = 131,mod = 70177,Mod = 92311;
    int n,l[2005],ans,f[2005];
    char a[2005][105];
    vector<dat> h[mod];
    int main(){
        cin>>n;
        for(int i = 1;i <= n;i++){
            scanf("%s",a[i] + 1);
            a[i][0] = '!';
            l[i] = strlen(a[i]) - 1;
            int hash = 0,Hash = 0;
            for(int j = 1;j <= l[i];j++){
                hash = (hash * sed + a[i][j]) % mod;
                Hash = (Hash * Sed + a[i][j]) % Mod;
            }
            tmp.Hash = Hash;
            tmp.id = i;
            h[hash].push_back(tmp);
        }
        for(int i = 1;i <= n;i++){
            f[i] = 1;
            int hash = 0,Hash = 0;
            for(int j = 1;j < l[i];j++){
                hash = (hash * sed + a[i][j]) % mod;
                Hash = (Hash * Sed + a[i][j]) % Mod;
                for(int k = 0;k < h[hash].size();k++){
                    if(h[hash][k].Hash == Hash) f[i] = max(f[i],f[h[hash][k].id] + 1);
                }
            }
            ans = max(ans,f[i]);
        }
        cout<<ans;
        return 0;
    }
  • 相关阅读:
    P1217 [USACO1.5]回文质数 Prime Palindromes
    C++ 队列(queue)堆栈(stack)实现基础
    深入理解指针—>指针函数与函数指针的区别
    C语言结构体及typedef关键字定义结构体别名和函数指针的应用
    实现常用的配置文件/初始化文件读取的一个C程序
    C语言sscanf和sprintf输入输出使用及Strlen、Memset解释
    C语言一些基础知识
    Google的开源C++单元测试框架Google Test
    网站(Web)压测工具Webbench源码分析
    web压测工具http_load原理分析
  • 原文地址:https://www.cnblogs.com/hyfer/p/5791416.html
Copyright © 2011-2022 走看看