蒟蒻八模哈希WAon#1,求助
查看原帖
蒟蒻八模哈希WAon#1,求助
635570
baka24楼主2023/11/8 20:07

调好久调不出来,求大佬看看呜呜呜

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN=1050010,base=131;
int Mod=1011451423;
int t,n,jc[MAXN],num[MAXN],sum[MAXN];char a[MAXN];bool as[MAXN],as2[MAXN],as3[MAXN];
int ms[10]={10000000000037,10009736508713,10009736508731,10009736508763,10000000000183,10000000000259,10000000000267,10000000000273};
int Hsh(int x,char c){
    return (x*base%Mod+(int)c)%Mod;
}
signed main(){
    scanf("%lld",&t);
    jc[0]=1;
    for(int i=1;i<=MAXN-5;i++)jc[i]=jc[i-1]*base%Mod;
    while(t--){
        scanf("%s",a+1);
        as[1]=1;
        int n=strlen(a+1);
        for(int i=0;i<=n+10;i++)as[i]=1;
        for(int kk=0;kk<8;kk++){Mod=ms[kk];
        for(int i=1;i<=n;i++){
            if(a[i]!=a[1])as[1]=0;
            num[i]=Hsh(num[i-1],a[i]);
        }
        for(int i=n;i>=1;i--){
            sum[i]=Hsh(sum[i+1],a[i]);
        }
        as[n]=1;
        int jl=0;
        for(int i=n-1;i*2-1>n;i--){
            jl=Hsh(jl,a[i+1]);
            if(jl==(num[i-1]-num[i-n+i-1]*jc[n-i]%Mod+Mod)%Mod){
                as[i]&=1;
            }
            else as[i]=0;
        }
        for(int i=(n+1)/2;i>=1;i--){
            int x=num[i-1],y=(sum[i+1]-sum[2*i]*jc[i-1]%Mod+Mod)%Mod;
            if(x==y&&as[2*i-1])as[i]&=1;
            else as[i]=0;
        }
        }
        for(int i=1;i<=n;i++){
            if(as[i]){
                printf("%lld ",i);
            }
            as[i]=0;
        }
        printf("\n");
    }
    return 0;
}
2023/11/8 20:07
加载中...