求优化
查看原帖
求优化
1044870
Lyrith_with_xQ楼主2023/9/25 20:37

#4超时,求优化

#include <bits/stdc++.h>
using namespace std;

int n,mmax=-1,vis[25];
string s[25];
char start;

int intersect(string a,string b)//返回两个字符串接龙时相交部分最小长度
{
	string ans="";
	int len=0;
	for(int i=a.size()-1;i>=0&&a.size()-i<=b.size();i--)
	{
		int f=0;
		for(int j=0,k=i;k<a.size();j++,k++)
		{
			if(a[k]!=b[j])
			{
				f=1;
				break;
			}
		}
		ans=a[i]+ans;
		len++;
		if(!f)return (len==a.size()||len==b.size()? 0:len);
	}
	if(ans==a||ans==b)return 0;
	else return len;
}

void dfs(string a,int ind)
{
	bool check=false;
	vis[ind]++;
	for(int i=0;i<n;i++)
	{
		if(vis[i]==2||intersect(a,s[i])==0)continue;
		check=true;
		string ns=a+s[i].substr(intersect(a,s[i]),114514);
		dfs(ns,i);
		vis[i]--;
	}
	if(!check)
	{
		int siz=a.size();
		mmax=max(mmax,siz);
	}
}

int main()
{
    scanf("%d",&n);
	for(int i=0;i<n;i++)cin>>s[i];
	cin>>start;
	for(int i=0;i<n;i++)
	{
		if(s[i][0]!=start)continue;
		memset(vis,0,sizeof(vis));
		dfs(s[i],i);
	}
	printf("%d",mmax);
	return 0;
}
2023/9/25 20:37
加载中...