zoukankan      html  css  js  c++  java
  • Codevs 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)                                        

    以后不要用time变量,撞关键字

    /*
        不知道为什么枚举重合的长度的时候去掉break就A了
        把字符串从前面存储一遍,再从后面存储一遍,打包放到结构体里
        然后就是深搜,也没怎么剪枝,可能数据太弱
        题目没说字符串的最大长度是多少,我就直接用的string
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<map>
    using namespace std;
    int n,tim[30],ans;
    string start;
    struct node{
        int len;
        map<int,string>h;
        map<int,string>t;
        string c;
    }s[30];
    void dfs(int pos,int l){
        ans=max(ans,l);
        if(pos==0){
            for(int i=1;i<=n;i++)
                if(s[i].h[1]==s[0].h[1]){
                    tim[i]++;
                    dfs(i,s[i].len);
                    tim[i]--;
                }
            return;
        }
        if(tim[pos]>2)return;
        for(int i=1;i<=n;i++){
            if(tim[i]<2){
                for(int j=s[pos].len-1;j>=1;j--){//枚举重合的长度 
                    if(j>=s[i].len)continue;
                    if(s[pos].t[j]==s[i].h[j]){
                        tim[i]++;
                        dfs(i,l+s[i].len-j);
                        tim[i]--;
                    }
                }
            }
        }
    }
    int main(){
        scanf("%d",&n);
        string c;
        for(int i=1;i<=n;i++){
            cin>>s[i].c;
            s[i].len=s[i].c.length();
            string Head;
            for(int j=0;j<s[i].len;j++){
                Head+=s[i].c[j];
                s[i].h[j+1]=Head;
            }
            string Tail;
            for(int j=s[i].len-1,k=1;j>=0;j--,k++){
                Tail+=s[i].c[j];
                string T;
                int L=Tail.length();
                for(int f=L-1;f>=0;f--)
                    T+=Tail[f];
                s[i].t[k]=T;
            }
        }
        cin>>s[0].c;
        string Head;Head+=s[0].c[0];
        s[0].h[1]=Head;
        dfs(0,0);
        printf("%d",ans);
    }
  • 相关阅读:
    [整理]Cadence 生成带有网络追踪的 PDF 原理图
    [整理]FSM 有限状态机
    [原创]Quartus 中调用 Modelsim 波形仿真
    [原创]SPI 协议介绍以及基于 Verilog 的 IP 核实现
    [原创]Verilog 代码编程规范(个人用)
    [算法]线段树
    [算法]tarjan
    poj3280
    poj 3258 River Hopscotch
    [poj 1251]Jungle Roads
  • 原文地址:https://www.cnblogs.com/thmyl/p/7204670.html
Copyright © 2011-2022 走看看