• 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

    /*以字典序排序是比i小的单词都在i的前面 扫描一遍单词进行dfs插入 最后再dfs求树的深度*/
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<vector>
    const int M=100010;
    using namespace std;
    char ch[M][60];
    int n,l[M],flag,ans;
    vector<int>a[M];
    bool aaaa(int k,int x)
    {
        if (l[k]>=l[x])
            return false;
        for (int i=0;i<l[k];i++)
            if (ch[k][i]!=ch[x][i])
                return false;
        return true;
    }
    void sou(int k,int x)
    {
        if (flag)
            return;
        for (int i=0;i<a[k].size();i++)
            if (aaaa(a[k][i],x))
            {
                sou(a[k][i],x);
                return;
            }
        if(!flag)
        {
            a[k].push_back(x);
            flag=1;
            return;
        }
    }
    void dfs(int k,int t)
    {
        ans=max(ans,t);
        for (int i=0;i<a[k].size();i++)
            dfs(a[k][i],t+1);
    }
    int main()
    {
        scanf("%d",&n);
        for (int i=1;i<=n;i++)
        {
            cin>>ch[i];
            l[i]=strlen(ch[i]);
        }
        for (int i=1;i<=n;i++)
        {
            flag=0;
            sou(0,i);
        }
        dfs(0,0);
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    vue 组件轮播联动
    Echarts 解决饼图文字过长重叠的问题
    Echarts 背景渐变柱状图
    vue 组件间数据传递
    vue webpack build 打包过滤console.log()日志
    自定义字段排序
    vue 路由嵌套高亮问题
    微信小程序验证码获取倒计时
    解决小程序里面的图片之间有空隙的问题???
    axios使用
  • 原文地址:https://www.cnblogs.com/xiaoqi7/p/5861100.html
Copyright © 2020-2023  润新知