exKMP 35pts WA+TLE 求查错
查看原帖
exKMP 35pts WA+TLE 求查错
339846
RuntimeErr楼主2021/11/28 12:49

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;
}
2021/11/28 12:49
加载中...