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;
}