【搜索】P1019 单词接龙

题目描述

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

输入输出格式

输入格式:

 

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

 

输出格式:

 

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

 

输入输出样例

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

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N = 25;
 4 string S[N],tmp;
 5 int ans,n,vis[N];
 6 char Head[N];
 7 int check(string u,string v){
 8     int len = min( u.size()-1 , v.size()-1 );
 9     int L1 = u.length();
10     int L2 = v.length();
11     for(int i=1;i<=len;i++){
12         string tu = u.substr( L1 - i );
13         string tv = v.substr( 0 , i );
14         if( tu == tv ){
15             return i;
16         }
17     }
18     return -1;
19 }
20 void dfs(string x){
21     for(int i=1;i<=n;i++){
22         int F = check(x,S[i]);
23         if( vis[i] <2 &&  F != -1 ){
24             vis[i]++;
25             tmp = S[i].substr(F);
26             tmp = x + tmp;
27             dfs(tmp);
28             vis[i]--;
29         }
30     }
31     ans = max(ans, (int)x.length() );
32     return ;
33 }
34 int main()
35 {
36     ios_base :: sync_with_stdio(0);
37     cin.tie(NULL),cout.tie(NULL);
38     cin>>n;
39     for(int i=1;i<=n;i++){
40         cin>>S[i];
41     }
42     cin>>Head;
43     for(int i=1;i<=n;i++){
44         if( Head[0] == S[i][0]){
45             vis[i]++;
46             dfs(S[i]);
47             vis[i]--;
48         }
49     }
50     cout<<ans<<endl;
51 }
View Code

 

posted @ 2019-05-19 17:08  Osea  阅读(200)  评论(0编辑  收藏  举报