50分求助
查看原帖
50分求助
941801
louie2011楼主2024/7/8 13:27
#include<bits/stdc++.h>
using namespace std;
int n;
string str[50];
int len[50];
char dragon[10000];
char dragoncopy[10000];//副本,为了防止无法回溯
int dragonlen;
bool used[50];
int ans;
void dfs()
{
	bool found=0;
	for(int i=1;i<=n;i++)
	{
		if(!used[i])
		{
			for(int j=0;j<=min(dragonlen,len[i]);j++)
			{
				bool good=1;
				for(int k=dragonlen;k>=dragonlen-j;k--)
				{
					if(dragon[k]!=str[i][k-dragonlen+j])
					{
						good=0;
						break;
					}
				}
				if(good)
				{
					for(int i=1;i<=dragonlen;i++)
					{
						dragoncopy[i]=dragon[i];
					}
					for(int k=dragonlen+1;k<=dragonlen+len[i]-j-1;k++)
					{
						dragon[k]=str[i][k-dragonlen+j];
					}
					found=1;
					used[i]=1;
					dragonlen+=len[i]-j-1;
					dfs();
					dragonlen-=len[i]-j-1;
					for(int i=1;i<=dragonlen;i++)
					{
						dragon[i]=dragoncopy[i];
					}
				}
			}
		}
	}
	if(found==0)//没法拼接
	{
		ans=max(ans,dragonlen);
		for(int i=1;i<=dragonlen;i++)
		{
			cout<<dragon[i];
		}
		cout<<endl;
		return;
	}
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)//这边把每个单词都重复了2遍
	{
		cin>>str[i];
		str[i+n]=str[i];
		len[i]=str[i].length();
		len[i+n]=len[i];
	}
	n*=2;
//	for(int i=1;i<=n;i++)
//	{
//		cout<<str[i]<<endl;
//	}
	dragonlen=1;
	cin>>dragon[1];
	dfs();
	cout<<ans<<endl;
	return 0;
}

提交记录

2024/7/8 13:27
加载中...