hash 玄关求条
查看原帖
hash 玄关求条
663199
Tachibana27楼主2025/1/13 11:32

#include<bits/stdc++.h>
#define int unsigned __int128
int n;
int base;
int bas[1000086];
int has[1000086];
int sah[1000086];
    inline int read(){
        int s=0;
        int w=1;
        char ch=getchar();
        for(;ch<'0'||ch>'9';ch=getchar())
            if(ch=='-')
                w=-1;
        for(;ch>='0' and ch<='9';ch=getchar())
            s=s*10+ch-'0';
        return s*w;
    }
    void write(int x){
        if(x<0){
            putchar('-');
            x=-x;
        }
        if(x>9)
            write(x/10);
        putchar(x%10+'0');
        return;
    }
std::string q;
std::string s;
inline int qpow(int b,int p){
    int ans=1;
    while(p){
        if(p&1)
            ans=ans*b;
        b*=b;
        p>>=1;
    }
    return ans;
}
inline int geths(int l,int r){
    return has[r]-has[l-1]*qpow(base,r-l+1);
}
inline int getsh(int l,int r){
    return sah[l]-sah[r+1]*qpow(base,r-l+1);
}
int ans;
int cc;
int k;
std::map<int,bool>mp;
signed main(){
    // srand(time(NULL));
    base=19260817;
    n=read();
    for(int i=1;i<=n;i++){
        int x;
        x=read();
        s=s+(char)(x+'0');
    }
    // std::cout<<s;
    s=" "+s;
    bas[0]=1;
    for(int i=1;i<=n;i++)
        bas[i]=bas[i-1]*base;
    for(int i=1;i<=n;i++)
        has[i]=has[i-1]*base+s[i];
    for(int i=n;i;i--)
        sah[i]=sah[i+1]*base+s[i];
    for(int i=1;i<=n;i++){
        mp.clear();
        int l=1;
        int r=l+i-1;
        int cnt=0;
        while(r<=n){
            int hs1=geths(l,r);
            int hs2=getsh(l,r);
            if((not mp[hs1]) and (not mp[hs2]))
                cnt++;
            mp[hs1]=mp[hs2]=true;
            l+=i;
            r=l+i-1;
        }
        if(cnt>ans){
            ans=cnt;
            cc=0;
            k=i;
        }
        if(cnt==ans)
            cc++;
        // puts("debug: ");
        // write(cc);
        // puts("");
    }
    write(ans);
    putchar(' ');
    write(cc);
    puts("");
    write(k);
    return 0;
}

https://www.luogu.com.cn/record/197997275

玄关

2025/1/13 11:32
加载中...