其他分享
首页 > 其他分享> > 字符串哈希——1056E

字符串哈希——1056E

作者:互联网

典型的字符串哈希题

字符串hash[i]:子串s[1-i]代表的值

要截取串s[l-r]  求hash[r]-hash[l-1]*F[len]即可

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define P 131
#define mod 1000000007
#define maxn 3000005
char s[maxn],t[maxn];
ll cnt0,cnt1,len1,len2,n,F[maxn],ash[maxn];

int check(int a,int b){
    int last=0;
    ll h1,f1=0,h2,f2=0;
    for(int i=1;i<=len1;i++){
        if(s[i]=='0'){
            if(f1==0)h1=(ash[last+a]-ash[last]*F[a]%mod+mod)%mod,f1=1;
            else if(h1!=(ash[last+a]-ash[last]*F[a]%mod+mod)%mod) return 0;
            last+=a;
        }
        else {
            if(f2==0)h2=(ash[last+b]-ash[last]*F[b]%mod+mod)%mod,f2=1;
            else if(h2!=(ash[last+b]-ash[last]*F[b]%mod+mod)%mod) return 0;
            last+=b;
        }
    }
    if((h1+mod)%mod==(h2+mod)%mod)return 0;
    return 1;
}

int main(){
    F[0]=1;
    for(int i=1;i<=3000005;i++)F[i]=F[i-1]*P%mod;    
    cin>>s+1>>t+1;
    len1=strlen(s+1);len2=strlen(t+1);
    for(int i=1;i<=len1;i++)
        if(s[i]-'0')cnt1++;else cnt0++;
    for(int i=1;i<=len2;i++)
        ash[i]=t[i]-'a'+1+ash[i-1]*P,ash[i]%=mod;
    
    int ans=0;
    for(int i=1;i<=len2;i++){
        int t0=i,t1;
        if(t0*cnt0>=len2)break;
        if((len2-t0*cnt0)%cnt1==0){
            t1=(len2-t0*cnt0)/cnt1;
            if(check(t0,t1))ans++;
        }
    }
    cout<<ans<<endl;
}

 

标签:cnt1,1056E,int,len2,maxn,哈希,cnt0,字符串,define
来源: https://www.cnblogs.com/zsben991126/p/10822926.html