题目链接:https://www.luogu.org/problemnew/show/P1019
分析:注意,虽说题目说了重合的部分要连成一起,但不是强迫你把前后缀相同的必须连在一起!!!!!!!
事实上要求最长的话,应该是尽可能少的连接在一起。
另外,并不要求你所有单词都要用到
题解的话洛谷排名第二的题解就写的非常详细
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int inf=1<<30; const ll maxn=510; const double pi=acos(-1); const int mod=10000; int n; string a[21]; int mx=-1; int vis[21]; int getsame(string a,string b){ int len=a.length(); for(int i=1;i<min(a.length(),b.length());i++){ bool flag=1; for(int j=0;j<i;j++){ if(a[len-i+j]!=b[j]){ flag=0; } } if(flag) return i;//如果相等,则立即返回 } return 0; } void dfs(string s,int len){ mx=max(mx,len); for(int i=0;i<n;i++){ if(vis[i]>=2)continue; int c=getsame(s,a[i]); if(c>0){ vis[i]++; dfs(a[i],len+a[i].length()-c); vis[i]--; } } } int main(){ scanf("%d",&n); for(int i=0;i<n;i++){ cin>>a[i]; } string c;cin>>c; dfs(' '+c,1); cout<<mx<<endl; return 0; }