用的dfs, AC了, 后两个点用了260+ms, 前面几个测试点时间都很正常, 最后两个太慢了, 是不是因为有冗余的执行步骤, 求指教.
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int n;char start;
int ans;string now;
string box[44];//每个字符串, 储存了两次, 因此开了40
bool use[44];//是否用过
bool whetherlink(string a,string b)//b follows a;
{
int la=a.length(),lb=b.length();
bool q=0;int i;
for(i=la-1;i>=1;i--)
if(b.find(a.substr(i,la-i))==0)
{q=1;break;}
//如果全相等不认为包含, 题意应该是这样
if(la!=lb&&b.find(a)==0) q=0;
if(la!=lb&&la>=lb&&a.substr(la-lb,lb)==b)
q=0;
return q;
}
string linkword(string a,string b)
{
int la=a.length(),lb=b.length();
for(int i=la-1;i>=1;i--)
if(b.find(a.substr(i,la-i))==0)
return a.substr(0,i)+b;//返回链接后的string
}
void dfs(int x)//搜索第x位置;x>=2
{
if(x>2*n)
{
ans=max(ans,(int)now.length());
return;
}
for(int k=0;k<=1;k++)
{
if(k)
for(int i=1;i<=2*n;i++)
{
if(use[i]==0&&whetherlink(now,box[i]))
{
string tmp=now;//储存链接之前的字符串
use[i]=1;//占位
now=linkword(now,box[i]);
dfs(x+1);//搜索下一位
use[i]=0;//取消占位
now=tmp;//恢复链接前的字符串
}
}
else dfs(x+1);//这一位不要直接搜下一位
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>box[i];
box[i+n]=box[i];
}
cin>>start;
for(int i=1;i<=n;i++)
{
if(box[i][0]==start)
{
now=box[i];
use[i]=1;
dfs(2);
use[i]=0;
}
}
cout<<ans;
return 0;
}