• 1018 单词接龙


    1018 单词接龙

     

    2000年NOIP全国联赛普及组NOIP全国联赛提高组

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 黄金 Gold
     
     
    题目描述 Description

        单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at和atide间不能相连。

    输入描述 Input Description

       输入的第一行为一个单独的整数n(n<=20)表示单词数,以下n行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.

    输出描述 Output Description

       只需输出以此字母开头的最长的“龙”的长度

    样例输入 Sample Input

    5

    at

    touch

    cheat

    choose

    tact

    a

    样例输出 Sample Output

    23    

    数据范围及提示 Data Size & Hint

    (连成的“龙”为atoucheatactactouchoose)                                        

    分类标签 Tags 

     暴力搜索

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    char s[30][30];
    int vis[30];
    int con[30][30];
    int ans=0,n;
    void dfs(int i,int l)// 第i个词 当前长度
    {
        if(l>ans)ans=l;
        for(int j=1;j<=n;j++){
            if(con[i][j]&&vis[j]<2){//最多2次 
                vis[j]++;
                dfs(j,l+con[i][j]);
                vis[j]--;
            }
        }
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%s",s[i]);
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                int maxx=max(strlen(s[i]),strlen(s[j]))-1;//判断能否j在i的后面 
        //等价    int maxx=(strlen(s[i]),strlen(s[j]))-1; 
                for(int l=1;l<=maxx;l++){
                    int ok=1;
                    for(int k=0;k<l;k++){
                        if(s[i][strlen(s[i])-l+k]!=s[j][k]){
                            ok=0;break;
                        }
                    }
                    if(ok){
                        con[i][j]=strlen(s[j])-l;
                        break;
                    }
                }  
            }
        }
        char c[3];
        scanf("%s",c);
        for(int i=1;i<=n;i++)
        if(s[i][0]==c[0]){//首字母 
            vis[i]++;
            dfs(i,strlen(s[i]));
            vis[i]--;
        }
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    PHP实现智能语音播报
    scrapy随机切换user-agent
    scrapy 下载器中间件 随机切换user-agent
    scrapy xpath去除空格
    scrapy 爬虫中间件 deepth深度
    scrapy 爬虫中间件 httperror中间件
    scrapy爬虫中间件-urlLength
    转载:Java 内存区域和GC机制
    JavaScript中对象数组 作业题目以及作业
    【转载】解决nginx负载均衡的session共享问题
  • 原文地址:https://www.cnblogs.com/shenben/p/5536956.html
Copyright © 2020-2023  润新知