Description
成语接龙的的游戏大家都玩过,现在咱们换换玩法,玩个英文版的“成语接龙”,规则是已知n个单词,给出龙头字母,要求以这个字母开头的最长的“龙”(每个单词最多在“龙”中出现2次),在两个单词相连时,起重合的部分合为一部分,例如best和stabber,接成一条龙则变为bestabber,另外相邻的两部分不能存在包含关系,例如at 和 atside 间不能相连。
Input
输入的第一行为一个整数n (n<=20),表示单词个数,以下n 行每行有一个单词(长度不超过50),输入的最后一行为一个单个字符,表示“龙”开头的字母。此字母开头的“龙”一定存在.
Output
只需输出以此字母开头的最长的“龙”的长度
Sample Input
5
at
touch
cheat
choose
tact
a
Sample Output
23
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
struct st
{
char c[55];//
int cnt;//出现次数
int len;//字符串长度
}s[25];
int maxx = 0;
int n;
int conn( int x, int le)
{
if( maxx < le )
{
maxx = le ;
}
int i , j, l;
for( i = 1; i<=n; i++)
{
if( s[i].cnt <= 2 )
{
for( j =0; j<strlen( s[x].c); j++)
{
if( s[i].c[0] == s[x].c[j] )
{
bool t = 1;//布尔变量
int commonlen = 1;
for( l = j+1; l<strlen( s[x].c)&& commonlen<strlen( s[i].c ); commonlen++, l++)//如果有包含关系 通过commonlen会减掉 必经只求长度
{
if( s[x].c[l] != s[i].c[commonlen] )
{
t = 0;
break;
}
}
if( t == 1 )
{
s[i].cnt++;
conn( i, le+strlen(s[i].c )-commonlen);
s[i].cnt--;
}
}
}
}
}
}
int main()
{
cin>>n;
int i;
for( i = 1; i<=n ;i++)
{
cin>>s[i].c;
s[i].len = strlen( s[i].c );
s[i].cnt = 0;
}
scanf("%s", s[0].c );
conn( 0, 1 );//首单词的下标 长度
printf("%d\n", maxx );
return 0;
}