WA 28 求助
查看原帖
WA 28 求助
549499
Disjoint_cat楼主2022/10/20 13:58

rt,z数组完全没问题,只是p锅了

对着题解看了114514小时也没看出来

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=20000005;
char a[N],b[N];
int n,m,z[N],p[N],pos,ma,l;
void Z()//9~21:z 22~35:p
{
	z[0]=n,pos=1;
	for(int i=1;i<n;i++)
	{
		l=z[i-pos];
		if(l<=ma-i)z[i]=l;
		else
		{
			z[i]=max(0,ma-i+1);
			while(i+z[i]<n&&b[i+z[i]]==b[z[i]])z[i]++;
			pos=i,ma=i+z[i]-1;
		}
	}
	//for(int i=0;i<n;i++)cout<<z[i]<<" ";
	while(a[ma]==b[ma]&&ma<m&&ma<n)ma++;
	pos=0,p[0]=ma,ma=0;
	for(int i=1;i<m;i++)
	{
		l=z[i-pos];
		if(l<=ma-i)p[i]=l;
		else
		{
			p[i]=max(0,ma-i+1);
			while(p[i]<n&&i+p[i]<m&&a[i+p[i]]==b[p[i]])p[i]++;
			pos=i,ma=i+p[i]-1;
		}
	}
	//for(int i=0;i<m;i++)cout<<p[i]<<" ";
	//cout<<endl;
}
ll qz(int *arr,int X)
{
	ll s=0;
	for(int i=0;i<X;i++)s^=(ll)(i+1)*(arr[i]+1);
	return s;
}
int main()
{
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	scanf("%s%s",a,b);
	n=strlen(b),m=strlen(a);
	Z();
	cout<<qz(z,n)<<endl<<qz(p,m);
	return 0;
}
2022/10/20 13:58
加载中...