[T][2]NOIP 2001 单词接龙

来源:互联网 发布:windows手机壁纸 编辑:程序博客网 时间:2024/06/05 06:14

题目描述

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

输入输出格式
输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:
5
at
touch
cheat
choose
tact
a

输出样例#1:
23 (连成的“龙”为atoucheatactactouchoose)

说明

NOIp2000提高组第三题


【分析】
暴搜水题…


【代码】

//洛谷 P1019 单词接龙#include<cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define ll long long#define M(a) memset(a,0,sizeof a)#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;const int mxn=25;char s[25][100005];int n,ans;int vis[mxn],len[mxn];inline void dfs(int num,int res){    int i,j,k;    ans=max(ans,res);    for(i=len[num];i>=2;i--)    {        fo(j,1,n)          if(vis[j]<2)          {              bool flag=1;              fo(k,1,len[num]-i+1)                if(s[j][k]!=s[num][i+k-1]) {flag=0;break;}              if(!flag) continue;              vis[j]++;              dfs(j,res-len[num]+i+len[j]-1);              vis[j]--;          }    }}int main(){    int i,j;    scanf("%d",&n);    fo(i,1,n)    {        scanf("%s",s[i]+1);        len[i]=strlen(s[i]+1);    }    fo(i,1,n)    {        vis[i]++,dfs(i,len[i]),vis[i]--;        if(ans==31) break;    }    printf("%d\n",ans);    return 0;}
0 0
原创粉丝点击