模板题
洛谷P5410
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=2e7+7;
char s[maxn],t[maxn];
ll z[maxn],p[maxn];
void cal_z(char *s,ll n)
{
z[1]=n-1;
ll l=0,r=0;
for(ll i=2;i<n;i++)
{
if(i>r){
z[i]=0;
while (i+z[i]<n && s[i+z[i]]==s[1+z[i]])
z[i]++;
l=i,r=l+z[i]-1;
}
else
{
z[i]=min(r-i+1,z[i-l+1]);
while (i+z[i]<n && s[i+z[i]]==s[1+z[i]])
z[i]++;
if(i+z[i]-1>r)
l=i,r=l+z[i]-1;
}
}
}
void cal_p(char *s,char *t,int lens,int lent)
{
ll l,r;l=r=0;
for(ll i=1;i<lens;i++)
{
if(i>r)
{
p[i]=0;
while (i+p[i]<lens && 1+p[i]<lent && s[i+p[i]]==t[1+p[i]])
p[i]++;
l=i,r=l+p[i]-1;
}
else
{
p[i]=min(r-i+1,z[i-l+1]);
while (i+p[i]<lens && 1+p[i]<lent && s[i+p[i]]==t[1+p[i]])
p[i]++;
if(i+p[i]-1>r)
l=i,r=l+p[i]-1;
}
}
}
void init()
{
memset(z,0,sizeof(z));
memset(z,0,sizeof(z));
}
int main()
{
scanf("%s",s+1);
scanf("%s",t+1);
ll lens=strlen(s+1)+1;
ll lent=strlen(t+1)+1;
cal_z(t,lent);
cal_p(s,t,lens,lent);
ll ans1=0,ans2=0;
for(ll i=1;i<lent;i++)
ans1^=ll(i)*(z[i]+1);
printf("%lld\n",ans1);
for(ll i=1;i<lens;i++)
ans2^=i*(p[i]+1);
printf("%lld\n",ans2);
return 0;
}