题目描述
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连。
输入格式
输入的第一行为一个单独的整数n (n≤20)表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.
输出格式
只需输出以此字母开头的最长的“龙”的长度
输入输出样例
输入 #1
5 at touch cheat choose tact a
输出 #1
23
说明/提示
(连成的“龙”为atoucheatactactouchoose)
NOIp2000提高组第三题
分析:
由于本题中n<=20,故可以尝试使用dfs暴力枚举下一个选择的字符串,并与上一个进行比对,这样的话是2^20,依然不会超时。
CODE:
1 #include<cmath>
2 #include<cstdio>
3 #include<cstring>
4 #include<iostream>
5 #include<algorithm>
6 using namespace std;
7 const int M=105;
8 int n;
9 char s[M][M],c;
10 int get(){
11 int res=0,f=1;
12 char c=getchar();
13 while (c>'9'||c<'0') {
14 if (c=='-') f=-1;
15 c=getchar();
16 }
17 while (c<='9'&&c>='0'){
18 res=(res<<3)+(res<<1)+c-'0';
19 c=getchar();
20 }
21 return res*f;
22 }
23 int flag[M];
24 int ans;
25 void dfs(int last,int len){
26 //cout<<last<<" "<<len<<endl;
27 ans=max(ans,len);
28 for (int i=1;i<=n;i++){
29 //cout<<"guocheng"<<i<<" "<<last<<endl;
30 //cout<<s[i][1]<<" "<<s[last][strlen(s[last]+1)]<<" "<<flag[i]<<endl;
31 bool ok=false;
32 int pos=0;
33 int minn=1<<10;
34 for (int j=1;j<=min(strlen(s[last]+1),strlen(s[i]+1));j++){
35 bool bjj=true;
36 int x=strlen(s[last]+1);
37 for (int k=x;k>=x-j+1;k--){
38 /*cout<<x<<" "<<j<<" "<<k<<" "<<j-(x-k)<<endl;
39 cout<<s[i][j-(x-k)]<<" "<<s[last][k]<<endl;*/
40 if (s[i][j-(x-k)]!=s[last][k]) {bjj=false;break;}
41 }
42 //cout<<j<<" "<<bjj<<" "<<pos<<endl;
43 if (bjj) ok=true,pos=j,minn=min(minn,pos);
44 }
45 //cout<<ok<<" "<<pos<<endl;
46 if (ok&&flag[i]<2&&((i==last&&pos!=minn)||pos!=strlen(s[i]+1))){
47 flag[i]++;
48 pos=min(pos,minn);
49 dfs(i,strlen(s[i]+1)+len-pos);
50 flag[i]--;
51 }
52 }
53 return ;
54 }
55 int main(){
56 n=get();
57 for (int i=1;i<=n;i++) scanf ("%s",s[i]+1);
58 scanf("\n");
59 scanf ("%c",&c);
60 for (int i=1;i<=n;i++){
61 if (s[i][1]==c){
62 memset(flag,0,sizeof(flag));
63 flag[i]=1;
64 dfs(i,strlen(s[i]+1));
65 }
66 }
67 printf ("%d",ans);
68 return 0;
69 }