三模哈希 WA on #1 求助
查看原帖
三模哈希 WA on #1 求助
906856
A2_Zenith楼主2023/11/9 17:02
#include<bits/stdc++.h>
#define int long long
using namespace std;
int preh1[1000007];
int preh2[1000007];
int preh3[1000007];
int sufh1[1000007];
int sufh2[1000007];
int sufh3[1000007];
int bs1[1000007];
int bs2[1000007];
int bs3[1000007];
const int base1=31;
const int mod1=1e9+7;
const int base2=29;
const int mod2=1e9+9;
const int base3=37;
const int mod3=998244353;

int t;
signed main(){
    cin>>t;
    while(t--){
        string s;
        cin>>s;
        int l=s.length();
        memset(preh1,0,sizeof(preh1));
        memset(preh2,0,sizeof(preh2));
        memset(preh3,0,sizeof(preh3));
        memset(sufh1,0,sizeof(sufh1));
        memset(sufh2,0,sizeof(sufh2));
        memset(sufh3,0,sizeof(sufh3));
        bs1[0]=1;
        bs2[0]=1;
        bs3[0]=1;
        for(int i=1;i<=l;i++){
            preh1[i]=(preh1[i-1]*base1+s[i-1])%mod1;
            bs1[i]=bs1[i-1]*base1%mod1;
            preh2[i]=(preh2[i-1]*base2+s[i-1])%mod2;
            bs2[i]=bs2[i-1]*base2%mod2;
            preh3[i]=(preh3[i-1]*base3+s[i-1])%mod3;
            bs3[i]=bs3[i-1]*base3%mod3;
        }
        for(int i=l;i>=1;i--){
            sufh1[i]=(sufh1[i+1]*base1+s[i-1])%mod1;
            sufh2[i]=(sufh2[i+1]*base2+s[i-1])%mod2;
            sufh3[i]=(sufh3[i+1]*base3+s[i-1])%mod3;
        }
        for(int i=2;i<=l;i++){
            bool f=true;
            int p=i;
            while(p<=(l+1)/2){
                bool flg1=preh1[p]!=((sufh1[p]-sufh1[2*p]*bs1[p])%mod1+mod1)%mod1;
                bool flg2=preh2[p]!=((sufh2[p]-sufh2[2*p]*bs2[p])%mod2+mod2)%mod2;
                bool flg3=preh3[p]!=((sufh3[p]-sufh3[2*p]*bs3[p])%mod3+mod3)%mod3;
                if(flg1||flg2||flg3){
                    //cout<<i<<" "<<p<<endl;
                    f=false;
                    break;
                }
                p=2*p-1;
            }
            bool flg1=sufh1[p]!=((preh1[p]-bs1[l-p+1]*preh1[2*p-l-1])%mod1+mod1)%mod1;
            bool flg2=sufh2[p]!=((preh2[p]-bs2[l-p+1]*preh2[2*p-l-1])%mod2+mod2)%mod2;
            bool flg3=sufh3[p]!=((preh3[p]-bs3[l-p+1]*preh3[2*p-l-1])%mod3+mod3)%mod3;
            if(flg1||flg2||flg3){
                //cout<<p<<endl;
                f=false;
            }
            if(f)cout<<i<<" ";
        }
        cout<<endl;
   }
}


2023/11/9 17:02
加载中...