题目:NOIP 2000.3
openjudge 3724
http://bdfz.openjudge.cn/noiptigao/200003/
-
总时间限制:
- 10000ms 单个测试点时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连。
输入
- 输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在. 输出
- 只需输出以此字母开头的最长的“龙”的长度 样例输入
-
5 at touch cheat choose tact a
样例输出
-
23 (连成的“龙”为atoucheatactactouchoose)
提示
- 共有5个测试点
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
string s[22];
int flag[22];
int dp(string s1,int m,int n){
flag[m]++;
int max=s1.length(),l=s1.length();
for(int i=l-1;i>0;i--)
for(int j=0;j<n;j++){
bool f=true;
for(int k=0;k<l-i;k++)
if(s1[i+k]!=s[j][k]){
f=false;
break;
}
if(f&&flag[j]<2){
int num=dp(s[j],j,n);
if(num+s1.length()+i-l>max){
max=num+s1.length()+i-l;
}
flag[j]--;
}
}
return max;
}
int main(){
int n;
char x;
cin>>n;
memset(flag,0,sizeof(flag));
for(int i=0;i<n;i++){
cin>>s[i];
}
cin>>x;
int count=0,num;
for(int i=0;i<n;i++){
if(s[i][0]==x){
num=dp(s[i],i,n);
if(num>count)
count=num;
}
}
cout<<count<<endl;
return 0;
}