单词接龙

题目链接: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;
}
原文地址:https://www.cnblogs.com/qingjiuling/p/10692421.html