WA7个点,求调
查看原帖
WA7个点,求调
848964
hzoi_Shadow楼主2024/3/12 17:02
#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define ull unsigned long long
#define sort stable_sort 
#define endl '\n'
int nxt[200010],f[(1<<22)+10][22],g[22][22];
string s[22],ss[22],t;
int main()
{
	int m,n=0,ans=0x7f7f7f7f,flag,i,j,k,x,y;
	cin>>m;
	memset(f,0x3f,sizeof(f));
	for(i=0;i<=m-1;i++)
	{
		cin>>ss[i];
		flag=0;
		for(j=0;j<=n-1;j++)
		{
			if(s[j].find(ss[i])!=string::npos)
			{
				flag=1;
				break;
			}
		}
		if(flag==0)
		{
			s[n]=ss[i];
			n++;
		}
	}
	for(x=0;x<=n-1;x++)
	{
		for(y=0;y<=n-1;y++)
		{
			if(x!=y)
			{
				t=' '+s[y]+'#'+s[x];
				for(i=2,nxt[1]=j=0;i<t.size();i++)
				{
					while(j>=1&&t[i]!=t[j+1])
					{
						j=nxt[j];
					}
					j+=(t[i]==t[j+1]);
					nxt[i]=j;
				}
				g[x][y]=nxt[t.size()-1];
			}
		}
	}
	for(i=0;i<=n-1;i++)
	{
		f[(1<<i)][i]=s[i].size();
	}
	for(i=0;i<=(1<<n)-1;i++)
	{
		for(j=0;j<=n-1;j++)
		{
			if((i>>j)&1)
			{
				for(k=0;k<=n-1;k++)
				{
					if(j!=k&&((i>>k)&1))
					{
						f[i][j]=min(f[i][j],f[i-(1<<j)][k]-g[k][j]+(int)s[j].size());
					}
				}
			}
		}
	}
	for(i=0;i<=n-1;i++)
	{
		ans=min(ans,f[(1<<n)-1][i]);
	}
	cout<<ans<<endl;
	return 0;
}
2024/3/12 17:02
加载中...