洛谷P1019
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<stack>
#include<cstring>//
using namespace std;
int n,num;
string w[25];//记录单词
int use[25];//记录使用单词次数
int ans,now=1;//记录接龙的长度,now=1是省略了头字母
void dfs(int k)//深搜
{
ans=max(ans,now);//跟上个题解学的,取大
for(int i=1;i<=n;i++)//搜索每个单词
{
if(use[i]<2)//判断
{
for(int j=0;j<w[k].length();j++)//判断,如果首字母相同则比较
if(w[i][0]==w[k][j])
{
int l1=j,l2=0;
while(w[i][l2]==w[k][l1]&&l1<w[k].length())l1++,l2++;//比较至词尾
if(l1>=w[k].length())//如果比较完成
{
now+=w[i].length()-l2;//新单词减去与上个单词重合的长度
use[i]++;
dfs(i);//以这个单词为新节点搜索
now-=w[i].length()-l2;
use[i]--;
}
}
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>w[i];
cin>>w[0];//**把头字母看做一个单词**
dfs(0);//**从头字母这个单词搜索**
cout<<ans;
return 0;
}
浙公网安备 33010602011771号