根据题目上说每个单词都最多在“龙”中出现两次,两个字符串相连会发生,其重合部分合为一部分
样例
5
at
touch
cheat
choose
tact
a
最终想要的结果是最长拼接字符串 拼接字符串的时候难道不是尽量去避免出现重合的情况呢?
at -> cheat -> choose -> touch -> tact
因为每个单词可以出现两次那么将这次相当于在后面接着拼接这种情况一次
即atcheatchoosetouchtactatcheatchoosetouchtact
结果难道不是44吗???
如下自己写的代码,最大最小都试了一下,一个44,一个19
#include <bits/stdc++.h>
using namespace std;
int n,ans,res;
string s,w[50],t;
int vis[50];
char c;
string concatStr(string s1,string s2) {
string temp = s2;
while(1) {
if(s1.find(temp) != string::npos && s1.find(temp) + temp.size() == s1.size() || temp == "") break;
temp = temp.substr(0,temp.size() - 1);
}
return s1 + s2.substr(temp.size(),s2.size() - temp.size());
}
int dfs(int u,string str) {
if(u == 2 * n - 1) {
int len = str.size();
res = max(len,res);
return res;
}
for(int i = 1;i <= 2 * n;i++) {
if(vis[i]) continue;
vis[i] = 1;
dfs(u + 1,concatStr(str,w[i]));
vis[i] = 0;
}
return res;
}
int main(){
cin >> n;
for(int i = 1;i <= n;i++) {
cin >> t;
w[i] = t;
w[i + n] = t;
}
cin >> c;
for(int i = 1;i <= 2 * n;i++) {
memset(vis,0,sizeof(vis));
res = 0;
if(w[i][0] == c) {
vis[i] = 1;
ans = max(ans,dfs(0,w[i]));
}
}
cout << ans << endl;
return 0;
}