题目链接如上。
题目大致思路:首先我们知道了首字母是哪一个,然后我们就可以一一枚举其他所有字母找到拼接最长的。这道题的难点就在于拼接操作。我们可以枚举两个拼接字符串的所有接口长度,判断该接口长度是否能够进行拼接,如果可以则继续搜索。同时我们还需要用一个数组记录一下每一个字符的使用次数,每一个字符的使用最多一次。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <vector>
#include <map>
using namespace std;
const int MAXN = 101;
string word[MAXN];
map<string,int> vis;
int ans1 = 0, n;
string ans2;
inline bool check(string s,string t,int k) {
int len = s.size();
for(int i = 0; i < k; i++) {
if(s[len - k + i] != t[i]) return false;
}
return true;
}
inline void connect(string &s,string t,int k) {
int len = t.size();
for(int i = k; i < len; i++) s += t[i];
}
void DFS(string ptr) {
int len = ptr.size();
ans1 = max(ans1,len);
for(int i = 0; i < n; i++) {
if(vis[word[i]] >= 2) continue;
int len = word[i].size();
for(int j = 1; j <= len; j++) {
string temp = ptr;
if(check(temp,word[i],j)) {
connect(temp,word[i],j);
if(temp == ptr) continue;
vis[word[i]]++;
DFS(temp);
vis[word[i]]--;
}
}
}
}
int main() {
cin >> n;
for(int i = 0; i < n; i++){
cin >> word[i];
vis[word[i]] = 0;
}
string st;
cin >> st;
DFS(st);
cout << ans1 << endl;
//cout << ans2 << endl;
return 0;
}