题目链接:https://www.luogu.com.cn/problem/P1019
题记:先把每两个单词重叠的部分进行记录(m函数),用一个vis函数记录单词的使用次数,最后搜索即可。
#include<bits/stdc++.h>
using namespace std;
int n,ans=0,l;
char c;
string s[50];
int xs[50][50];
int vis[50];
int m(int a,int b){
bool flag=true;
int k=0;
for(int i=s[a].size()-1;i>=0;i--){
for(int j=i;j<s[a].size();j++){
if(s[a][j]!=s[b][k++]){
flag=false;
break;
}
}
if(flag)
return s[a].size()-i;
flag=true;
k=0;
}
return 0;
}
void dfs(int i){
bool flag=false;
for(int j=1;j<=n;j++){
if(vis[j]>=2)continue;
if(xs[i][j]==0)continue;
if(xs[i][j]==s[i].size()||xs[i][j]==s[j].size())continue;
l+=s[j].size()-xs[i][j];
vis[j]++;
flag=true;
dfs(j);
vis[j]--;
l-=s[j].size()-xs[i][j];
}
if(flag==false)
ans=max(ans,l);
return ;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>s[i];
cin>>c;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
xs[i][j]=m(i,j);
for(int i=1;i<=n;i++){
if(s[i][0]==c){
l=s[i].size();
vis[i]++;
dfs(i);
vis[i]=0;
}
}
cout<<ans<<endl;
return 0;
}