P1859 单词接龙

发布时间 2023-05-25 12:41:02作者: 刘海烽
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int n,length=0,vis[1000]={0};string str[1000];
inline int check(string a,string b)
{
    int p=min(a.length(),b.length());
    for(int i=1;a.length()==1? i<=p:i<p;i++)
    {
       bool flag=true;
       for(int j=0;j<i;j++)
       {
          if(a[a.length()-i+j]!=b[j])
          {
              flag=false;
              break;
          }
       }
       if(flag==true) return i;
    }
    return 0;
}
void dfs(string s,int length_now)
{
    length=max(length,length_now);
    for(int i=1;i<=n;i++)
    {
        if(vis[i]>1) continue;
        else
        {
            int add=check(s,str[i]);
            if(add!=0)
            {
                vis[i]++;
                dfs(str[i],length_now+str[i].length()-add);
                vis[i]--;
            }
        }
    }

}
int main()
{
     cin>>n;
    for(int i=1;i<=n;i++)
     cin>>str[i];
     cin>>str[n+1];
     dfs(str[n+1],1);
     cout<<length<<endl;
     return 0;
}