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

输入

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

输出

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

样例输入

5
at
touch
cheat
choose
tact
a

样例输出

23

提示

 

样例说明:连成的“龙”为atoucheatactactouchoose。

明显是深搜。

然后注意理解题意,包含并不是两个相同的字符串不能连在一起。

搜索那段函数要多复习。

 1 #include <bits/stdc++.h>
 2 int n,ans=0;
 3 using namespace std;
 4 char s[21][1000];
 5 int judge[21][21];
 6 int flag[21],f[21];
 7 int vis(int a){
 8     int length=f[a];
 9     for(int i=1;i<=n;i++){
10          int   temp=0;
11         if(flag[i]<2&&judge[a][i]){
12             flag[i]++;
13             temp=vis(i);
14             flag[i]--;
15             temp+=f[a]-judge[a][i];
16         }
17         length=max(temp,length);
18     }
19     return length;
20 }
21 int main(){
22     ios::sync_with_stdio(false);
23     cin>>n;
24     int i,j,k;
25     for(i=1;i<=n;i++){
26          cin>>s[i];
27          f[i]=strlen(s[i]);
28     }
29     for(i=1;i<=n;i++){
30         for(j=1;j<=n;j++){
31             int len=min(f[i],f[j]);
32             for(k=1;k<=len;k++){
33                 if(strncmp(s[i]+f[i]-k,s[j],k)==0){
34                     if(k!=f[i]) judge[i][j]=k;
35                     break;
36                 }
37             }
38         }
39     }
40     char t;
41     cin>>t;
42     int maxn=0;
43     for(i=1;i<=n;i++){
44         if(s[i][0]==t){
45         flag[i]++;
46         maxn=max(maxn,vis(i));
47         flag[i]--;
48         }
49     }
50     cout<<maxn<<endl;
51     return 0;
52 }
View Code

strncmp的作用是比较第一个参数和第二个参数长度为第三个参数长度的字符串。