萌新求调,WA on test 4
查看原帖
萌新求调,WA on test 4
282609
A_little_Story楼主2023/3/10 17:05
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int mod=1019260817, mul=19260817;
int n, k, len[2005], r=1;
bool dp[2005][10005], pre[10005]={1}, id[10005]={0, 1}, newid[10005];
char ans[10005], s[2005][10005];
vector<long long>v[2005], v1[2005];
long long ksm[10005]={1}, h[10005], h1[10005], ksm1[10005]={1};
void calc()
{
	for(int i=r; i<=k; i++)
		ans[i]=127;
	long long x=0, y=0;
	for(int i=1; i<=k; i++)
	{
		x=x*mul%mod;
		x+=ans[i]-'a';
		y=y*mul;
		y+=ans[i]-'a';
		h[i]=x;
		h1[i]=y;
	}
}
int main()
{
	scanf("%d%d", &n, &k);
	for(int i=1; i<=n; i++)
		scanf("%s", s[i]);
	for(int i=1; i<=n; i++)
		len[i]=strlen(s[i]);
	for(int i=n; i; i--)
	{
		for(int j=0; j+len[i]<=k; j++)
			dp[i][j+len[i]]|=pre[j];
		for(int j=len[i]; j<=k; j++)
			pre[j]|=dp[i][j];
	}
	memset(pre, 0, sizeof(pre));
	for(int i=1; i<=n; i++)
	{
		for(int j=len[i]; j<k; j++)
			if(dp[i][j])
			{
				if(!pre[j])
					dp[i][j]=0;
				else
					pre[j-len[i]]=1;
			}
		if(dp[i][k])
			pre[k-len[i]]=1;
	}
	for(int i=1; i<=n; i++)
	{
		long long x=0, y=0;
		for(int j=0; j<len[i]; j++)
		{
			x=x*mul%mod;
			x+=s[i][j]-'a';
			y=y*mul;
			y+=s[i][j]-'a';
			v[i].push_back(x);
			v1[i].push_back(y);
		}
	}
	for(int i=1; i<=k; i++)
		ksm[i]=ksm[i-1]*mul%mod;
	for(int i=1; i<=k; i++)
		ksm1[i]=ksm1[i-1]*mul;
	calc();
	for(int i=1; i<=n; i++)
	{
		for(int j=1; j<=k; j++)
			if(id[j]&&dp[i][k+1-j])
			{
				int x=-1;
				for(int l=20; ~l; l--)
					if(x+(1<<l)<len[i]&&j+x+(1<<l)<=k)
						if(v[i][x+(1<<l)]==((h[j+x+(1<<l)]-ksm[x+(1<<l)+1]*h[j-1])%mod+mod)%mod)
							if(v1[i][x+(1<<l)]==h1[j+x+(1<<l)]-ksm1[x+(1<<l)+1]*h1[j-1])
								x+=1<<l;
				if(x==len[i]-1)
					newid[j+len[i]]=1;
				else if(s[i][x+1]<ans[j+x+1])
				{
					for(int l=0; l<len[i]; l++)
						ans[j+l]=s[i][l];
					r=j+len[i];
					for(int l=x+2; l<len[i]; l++)
						id[l+j]=newid[l+j]=0;
					id[r]=1;
					for(int l=r+1; l<=k; l++)
						id[l]=newid[l]=0;
					break;
				}
			}
		for(int j=1; j<=k; j++)
			id[j]|=newid[j];
		memset(newid, 0, sizeof(newid));
		calc();
	}
	for(int i=1; i<=k; i++)
		putchar(ans[i]);
}
2023/3/10 17:05
加载中...