代码:
#include<bits/stdc++.h>
#define int long long
#define N 40000005
using namespace std;
char a[N],b[N];
int la,lb,nxt[N],ext[N],ans1,ans2;
signed main(){
scanf("%s%s",a,b);la=strlen(a);lb=strlen(b);
int p=0,k=1,l;
nxt[0]=lb;
while(p+1<la&&b[p]==b[p+1]) p++;
nxt[1]=p;
for(int i=2;i<lb;i++){
p=nxt[k]+k-1;
l=nxt[i-k];
if(i+l<=p) nxt[i]=l;
else{
int j=max(0,p-i+1);
while(i+j<lb&&b[j]==b[i+j]) j++;
nxt[i]=j;
k=i;
}
}
p=0;k=0;
while(p<la&&p<lb&&a[p]==b[p]) p++;
ext[0]=p;
for(int i=1;i<la;i++){
p=ext[k]+k-1;
l=nxt[i-k];
if(i+l<=p) ext[i]=l;
else{
int j=max(0,p-i+1);
while(i+j<la&&a[i+j]==b[j]) j++;
ext[i]=j;
k=i;
}
}
for(int i=0;i<lb;i++) ans1^=(i+1)*(nxt[i]+1);
for(int i=0;i<la;i++) ans2^=(i+1)*(ext[i]+1);
printf("%lld\n%lld",ans1,ans2);
return 0;
}
记得开启O2优化