这个题最烦的地方就是题意有点点含糊
首先是“另外相邻的两部分不能存在包含关系”这句话的理解,这句话的最准确翻译就是 两个字符串接龙之后 不能等于其中任何一个字符串
其次就是两个字符串接龙时,如果有多种接法,使用最长那一种
AC代码如下:
#include <bits/stdc++.h> using namespace std; int const N = 25; string stringBox[N]; int useNum[N]; string startBox[N]; int startIndex[N]; int maxLen = -1; bool baohan(string a,string b){ if(a == b){ return false; } int len = a.size(); string sub = b.substr(0,len); return sub == a; } string fusion(string a,string b){ int len = a.size(); for(int i=len-1;i>=0;i--){ string sub = a.substr(i,len-i); if(sub == b.substr(0,len-i)){ string res = a.substr(0,i) + b; // cout << res << endl; return res; } } string ini = "#"; return ini; } void dfs(string s,int n){ int flag = 0; for(int i=1;i<=n;i++){ if(useNum[i] != 2){ flag = 1; } } if(flag){ for(int i=1;i<=n;i++){ if(useNum[i] == 2) { continue; } bool b = baohan(s,stringBox[i]); if(b){ continue; } string fuse = fusion(s,stringBox[i]); int len = fuse.size(); if(fuse != "#"){ useNum[i]++; if(len > maxLen){ maxLen = len; } dfs(fuse,n); useNum[i]--; } } } return; } int main() { int n = 0; cin >> n; for(int i=1;i<=n;i++){ cin >> stringBox[i]; } char start; cin >> start; int index = 0; for(int i=1;i<=n;i++){ if(stringBox[i][0] == start){ startBox[index] = stringBox[i]; startIndex[index] = i; index++; int len = stringBox[i].size(); if(len > maxLen){ maxLen = len; } } } for(int i=0;i<index;i++){ memset(useNum,0,sizeof(useNum)); useNum[startIndex[i]]++; dfs(startBox[i],n); } cout << maxLen << endl; return 0; }