int connect(string s1, string s2)
{
for(int i = 1; i < min(s1.size(), s2.size()); i++)
{
for(int j = 0; j < i; j++)
{
if(s1[s1.size() - i + j] != s2[j])
break;
return i;
}
}
return 0;
}
上面这个函数求连接处重叠字符长度wa,改成下面这个就ac了???
int connect(string s1, string s2)
{
for(int i = 1; i < min(s1.size(), s2.size()); i++)
{
int flag = 1;
for(int j = 0; j < i; j++)
{
if(s1[s1.size() - i + j] != s2[j])
flag = 0;
}
if(flag)
return i;
}
return 0;
}
下面是整体代码
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
string str[20];
int length = 0, n;
int freq[20];
int connect(string s1, string s2)
{
for(int i = 1; i < min(s1.size(), s2.size()); i++)
{
int flag = 1;
for(int j = 0; j < i; j++)
{
if(s1[s1.size() - i + j] != s2[j])
flag = 0;
}
if(flag)
return i;
}
return 0;
}
int dfs(string ss, int lengthnow)
{
length = max(length, lengthnow);
cout<<length<<" ";
for(int i = 0; i < n; i++)
{
if(freq[i] >= 2) continue;
int overlap = connect(ss, str[i]);
if(overlap > 0)
{
freq[i]++;
dfs(str[i], lengthnow + str[i].size() - overlap);
freq[i]--;
}
}
}
int main()
{
cin>>n;
for(int i = 0; i <= n; i++)
{
freq[i] = 0;
cin>>str[i];
}
dfs('#' + str[n], 1);
cout<<length;
return 0;
}