RT
代码思路很清晰我就不解释了
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
template<typename T>
void read(T &x) {
char ch=getchar();
int f=1;
x=0;
while(ch<'0'||ch>'9') {
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')x=(x*10)+(ch^'0'),ch=getchar();
x*=f;
}
const int N=2e7+10;
char a[N],b[N];
int n,m,z[N],p[N];
int main(){
scanf("%s",a+1);scanf("%s",b+1);
n=strlen(a+1),m=strlen(b+1);
z[1]=m;
for(int i=2,l=0,r=0;i<=m;++i){
z[i]=i<=r?min(z[i-l+1],r-i+1):0;
while(i+z[i]<=m&&b[z[i]+1]==b[i+z[i]])++z[i];
if(i+z[i]-1>r)l=i,r=i+z[i]-1;
}
for(int i=1,l=0,r=0;i<=n;++i){
p[i]=i<=r?min(p[i-l+1],r-i+1):0;
while(i+p[i]<=n&&b[p[i]+1]==a[i+p[i]])++p[i];
if(i+p[i]-1>r)l=i,r=i+p[i]-1;
}
long long ans=0;
for(int i=1;i<=m;++i)ans^=1ll*i*(z[i]+1);
printf("%lld\n",ans);ans=0;
for(int i=1;i<=n;++i)ans^=1ll*i*(p[i]+1);
printf("%lld\n",ans);
return 0;
}