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]='\0';
            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;
}
posted @ 2016-08-10 19:27  nancheng58  阅读(163)  评论(0编辑  收藏  举报