• Codevs 1051 接龙游戏


    1051 接龙游戏
    时间限制: 1 s
    空间限制: 128000 KB
    题目等级 : 钻石 Diamond
    题目描述 Description
    给出了N个单词,已经按长度排好了序。如果某单词i是某单词j的前缀,i->j算一次接龙(两个相同的单词不能算接龙)。
    你的任务是:对于输入的单词,找出最长的龙。
    输入描述 Input Description
    第一行为N(1<=N<=105)。以下N行每行一个单词(由小写组成),已经按长度排序。(每个单词长度<50)
    输出描述 Output Description
    仅一个数,为最长的龙的长度。
    样例输入 Sample Input
    5
    i
    a
    int
    able
    inter
    样例输出 Sample Output
    3
    数据范围及提示 Data Size & Hint
    1<=N<=105
    分类标签 Tags
    哈希表 栈 线性结构

    /*
    trie树.
    空间有点挤.
    70R.
    改成map 80 R依旧. 
    再开就爆了. 
    */
    #include<iostream>
    #include<cstdio>
    #include<map>
    #include<cstring>
    #define MAXN 1000001
    #define MAXM 100001
    #define MAXL 51
    using namespace std;
    int n,ans,tot;
    char s[MAXM][MAXL];
    struct data
    {
        bool b;
        map<int,int>next;
        int sum;
    }tree[MAXN];
    int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')  x=x*10+ch-48,ch=getchar();
        return x*f;
    }
    void add(int l,char s[])
    {
        int now=0;
        for(int i=0;i<l;i++)
        {
            int x=s[i]-96;
            if(tree[now].next[x])
              now=tree[now].next[x];
            else 
            {
                tot++;
                tree[now].next[x]=tot;
                now=tot;
            }
            tree[now].sum++;
        }
        tree[now].b=true;return ;
    }
    int find(int l,char s[])
    {
        int now=0,tot=0;
        for(int i=0;i<l;i++)
        {
            int x=s[i]-96;
            if(tree[now].next[x])
              {
                now=tree[now].next[x];
                if(tree[now].b) tot++;
              }
        }
        return tot;
    }
    int main()
    {
        n=read();
        for(int i=1;i<=n;i++)
        {
            cin>>s[i];
            int l=strlen(s[i]);
            add(l,s[i]);
        }
        for(int i=1;i<=n;i++)
        {
            int l=strlen(s[i]);
            ans=max(ans,find(l,s[i]));
        }
        printf("%d",ans);
        return 0;
    }
    /*
    map果然T了.
    80.
    */
    #include<iostream>
    #include<map>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #define MAXN 100001
    using namespace std;
    char str[MAXN][51],s[MAXN][51];
    int ans,tot;
    map<string,int>m;
    int main()
    {
        int l,n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>str[i];
            m[str[i]]++;
        }
        for(int i=1;i<=n;i++)
        {
            tot=0;
            int l=strlen(str[i]);
            for(int j=l;j>=0;j--)
              {
                str[i][j]='';
                if(m[str[i]]) tot++;
              }
            ans=max(tot,ans);
        }
        printf("%d",ans);
        return 0;
    }
    /*
    hash.
    然后W. 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define MAXN 300001
    #define MAXM 100001
    #define MAXL 51
    #define mod 10000007
    using namespace std;
    int n,ans,tot,sum;
    char s[MAXM][MAXL];
    bool b[mod+10];
    int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')  x=x*10+ch-48,ch=getchar();
        return x*f;
    }
    int hash(int l,int i)
    {
        long long tot=0;
        for(int j=0;j<l;j++)
          tot+=(s[i][j]-96)*13*j;
        return tot%mod;
    }
    int main()
    {
        n=read();
        for(int i=1;i<=n;i++)
        {
            cin>>s[i];
            int l=strlen(s[i]);
            b[hash(l,i)]=true;
        }
        for(int i=1;i<=n;i++)
        {
            sum=0;int l=strlen(s[i]);
            for(int j=1;j<=l;j++)
            {
                if(b[hash(j,i)]) sum++;
            }
            ans=max(sum,ans);
        }
        printf("%d",ans);
        return 0; 
    }
    /*
    原理和trie树类似.
    这样做主要就是为了省空间orz. 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define MAXN 5000001
    using namespace std;
    int tot,ans,head[MAXN],n,m,l,c[MAXN],now;
    bool w[MAXN];
    char s[51];
    struct data
    {
        int v,next,x;
    }e[MAXN];
    int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')  x=x*10+ch-48,ch=getchar();
        return x*f;
    }
    void add(int u,int v)
    {
        e[++now].v=v;
        e[now].next=head[u];
        head[u]=now;
    }
    void dfs(int p,int t)
    {
        if(t==l) return ;
        int id=0,x=s[t]-96;
        for(int i=head[p];i;i=e[i].next) if(e[i].v==x){id=i;break;}
        if(!id) add(p,x),id=now;
        if(t==l-1) {w[id]=true,tot++;return;}
        else if(w[id]) tot++;
        dfs(id,t+1);
    }
    int main()
    {
        n=read();
        for(int i=1;i<=n;i++)
        {
            scanf("%s",s);
            tot=0;
            l=strlen(s);
            dfs(0,0);
            ans=max(tot,ans);
        }
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    一、Python概念知识点汇总
    在ubuntu永久添加alias
    字符串转化为数字 不用sscanf
    python class类
    《Effective C++》笔记
    问到面向对象该如何回答
    数字和字符串互相转换
    python input print 输入输出
    《c专家编程》笔记
    判断是否是回文数
  • 原文地址:https://www.cnblogs.com/nancheng58/p/6070777.html
Copyright © 2020-2023  润新知