题目链接:http://www.acmicpc.sdnu.edu.cn/problem/show/1022

#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
using namespace std;
int panduan[25];
int sum;
int n;
string a[25];
void DFS(string b,int maxn)
{
    sum=max(maxn,sum);

    for (int i=1;i<=n;i++)
    {
        if(panduan[i]==2)continue;

        int len1=a[i].length();
        int len2=b.length();
        int len=min(len1,len2)-1;
        for (int j=len;j>=1;j--)。//关于字符串首位相接的问题,在字符串专栏有详细题解,在这里就不赘述,这里要减一,因为不能完全相接。
        {
            if(b.substr(len2-j,j)==a[i].substr(0,j))
            {
                panduan[i]++;
                DFS(a[i],maxn+len1-j);      //不要忘记在DFS之后将判断,还有要注意的,maxn跟sum,切记不要搞混,两者谁表示都可以,但一定要表示清楚,他们自己的含义是什么。
                panduan[i]--;
            }
        }
    }
}

int main ()
{
    char s;
    cin >> n;
    for (int i=1;i<=n;i++) cin >> a[i];
    cin >> s;
    sum=0;
    for (int i=1;i<=n;i++)        //从n个字符串中找到满足条件的点,进行DFS。
    {
        if(a[i][0]==s)
        {
            memset(panduan, 0, sizeof(panduan));
            panduan[i]++;
            DFS(a[i],a[i].length());
        }
    }
    cout << sum << endl;
    return 0;
}