这道题比较难处理的地方在于:链接两个字符串的处理函数
思路是连接后dfs搜索,寻求长度最大值
#include<bits/stdc++.h>
using namespace std;
const int maxn=25;
int n;
string str[maxn];
string cmp;
int lenth[maxn];
int use[maxn];
void init()
{
for(int i=0; i<maxn; ++i)
use[i]=2;
}
/**int unions(string now,string net)
{
int a=now.size(),b=net.size();
string sub;
for(int i=1; i<=min(a,b); ++i)
{
sub=net.substr(0,i);
if(now.rfind(sub)!=now.npos)
{
if(now.rfind(sub)==a-i)
return i;
}
}
return 0;
}**/
int unions(string now,string net)
{
int a=now.size(),b=net.size();
for(int i=1; i<=min(a,b); ++i)
{
bool flag=0;
for(int j=0; j<i; ++j)
if(now[a-i+j]!=net[j])
{
flag=1;
break;
}
if(flag)
continue;
return i;
}
return 0;
}
int res;
void dfs(string s,int l)
{
if(l>res)
res=l;
for(int i=0; i<n; ++i)
if(use[i]>0)
{
int c=unions(s,str[i]);
if(c==0)
continue;
use[i]--;
dfs(str[i],l+lenth[i]-c);
use[i]++;
}
}
int main()
{
init();
scanf("%d",&n);
for(int i=0; i<n; ++i)
{
cin>>str[i];
lenth[i]=str[i].size();
}
cin>>cmp;
res=cmp.size();
dfs(cmp,res);
printf("%d\n",res);
return 0;
}
这道题提供了一个首尾连接两个字符串并且返回重合串长度的值的函数
int unions(string now,string net)
{
int a=now.size(),b=net.size();
for(int i=1; i<=min(a,b); ++i)
{
bool flag=0;
for(int j=0; j<i; ++j)
if(now[a-i+j]!=net[j])
{
flag=1;
break;
}
if(flag)
continue;
return i;
}
return 0;
}
STL版的函数如下:
int unions(string now,string net)
{
int a=now.size(),b=net.size();
string sub;
for(int i=1; i<=min(a,b); ++i)
{
sub=net.substr(0,i);
if(now.rfind(sub)!=now.npos)
{
if(now.rfind(sub)==a-i)
return i;
}
}
return 0;
}