洛谷P1019 单词接龙

Posted Soda

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷P1019 单词接龙相关的知识,希望对你有一定的参考价值。

P1019 单词接龙

题目描述

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

输入输出格式

输入格式:

 

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

 

输出格式:

 

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

 

输入输出样例

输入样例#1:
5
at
touch
cheat
choose
tact
a
输出样例#1:
23           (连成的“龙”为atoucheatactactouchoose)   

说明

NOIp2000提高组第三题

(现在codevs处于崩溃状态,我就先来洛谷交了)

/*
    不知道为什么枚举重合的长度的时候去掉break就A了
    把字符串从前面存储一遍,再从后面存储一遍,打包放到结构体里
    然后就是深搜,也没怎么剪枝,可能数据太弱
    题目没说字符串的最大长度是多少,我就直接用的string
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
int n,time[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]){
                time[i]++;
                dfs(i,s[i].len);
                time[i]--;
            }
        return;
    }
    if(time[pos]>2)return;
    for(int i=1;i<=n;i++){
        if(time[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]){
                    time[i]++;
                    dfs(i,l+s[i].len-j);
                    time[i]--;
                    //break;
                }
            }
        }
    }
}
int main(){
    //freopen("Cola.txt","r",stdin);
    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);
}

 

以上是关于洛谷P1019 单词接龙的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P1019单词接龙 搜索

洛谷 P1019 单词接龙 深搜

洛谷P1019——单词接龙(DFS暴力搜索)

洛谷 P1019 单词接龙 Label:dfs

洛谷——P1019 单词接龙(NOIP2000 T3)

[NOIP2000] 提高组 洛谷P1019 单词接龙