SDNU 1022.成语接龙
Time Limit: 1000 MS Memory Limit: 32768 KB
Total Submission(s): 71 Accepted Submission(s): 35
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
典型的dfs题,还有对于字符串的处理,在碰到前缀后缀判断的时候,substr函数真的很好用,谁用谁知道。
值得注意的是对于前后缀的判断要从大向小判断。
仔细做还是很简单的,附上Ac代码:
#include<bits/stdc++.h>
using namespace std;
int maxn=0,n;
string a[30];
int pd[30]= {0};
void dfs(string b,int sum)
{
maxn=max(maxn,sum);
//cout<<sum<<' '<<b<<endl;
for(int i=0; i<n; i++)
{
if(pd[i]<2)
{
int lena=a[i].length();
int lenb=b.length();
int minx=min(lena,lenb);
for(int j=minx-1; j>=1; j--)
{
if(b.substr(lenb-j,lenb)==a[i].substr(0,j))
{
int x=b.substr(lenb-j,lenb-1).length();
pd[i]++;
dfs(a[i],sum+lena-x);
pd[i]--;
}
}
}
}
}
int main()
{
cin>>n;
for(int i=0; i<n; i++)
cin>>a[i];
char s;
cin>>s;
for(int i=0; i<n; i++)
{
if(a[i][0]==s)
{
memset(pd,0,sizeof(pd));
pd[i]++;
dfs(a[i],a[i].length());
}
}
cout<<maxn<<endl;
}