#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int n;
int ans = 0;
string s[22];
int u[22];
int check(string s1,string s2){
int t1 = s1.length();
int t2 = s2.length();
int t3 = min(t1,t2);
for (int i = 1;i <=t3;i++)
{ int p = 1;
for (int j = 0;j < i;j++) //s1 从length-i开始,到n,s2从0开始,到i
{
if (s1[t1-i+j]!=s2[j])
{
p = 0;
}
}
if (p == 1) return i;
}
return 0;
}
void dfs(int length,string s1){
if (length > ans ) ans = length;
for (int i = 1 ;i <= n;i++)
if (check(s1,s[i]) && u[i]<2) {
string s2;
s2 = s1;
int t = s[i].length();
/* for (int j = check(s1,s[i]);j <t;j++)
{
s2 +=s[i][j];
}*/
u[i]++;
dfs(length+t-check(s1,s[i]),s[i]);
u[i]--;
}
}
int main(){
cin >>n;
for (int i = 1;i <= n;i ++)
cin>>s[i];
cin>>s[n+1];
dfs(s[n+1].length(),s[n+1]);
cout<<ans;
return 0;
}
开始犯了两个错误:1.取的不是最小重叠而是最大重叠,在check中i从t3往1循环,这样会导致如果s1 是abcdaskask,s2是askaskabcd的话,重叠部分算的是askask,重叠数为6,而题目要求只需要ask就可以,为3
这样就会浪费很多位.只能过最后三个点.
第二个错误,check处最后忘记return 0,导致如果两个字符串没有重叠,则一直没有返回值,所以最后三个点一直在tle,hhh两个错误一个过了前三个点,一个过了后三个点,但没数据啊,还是没用
下面讲思路
两个函数,dfs和check,dfs用来跑搜索,check用来检查,检查的时候按照长度小的来…
dfs看了大佬的代码,我每次都会在更新字符串长度的时候把字符串也更新,最后估计会变成一个究极长的字符串,但其实只需要把新字符串变成a[i]就可以(不知道是不是bug,我觉的我的更保险,而且时间复杂度不会高很多).