zoukankan      html  css  js  c++  java
  • 字符串哈希——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;
    }
  • 相关阅读:
    Kafka
    js操作json
    Javascript的console.log()用法
    js中的instanceof运算符
    JS阻止事件冒泡的3种方法之间的不同
    js string to date
    JavaScript RegExp.$1
    JS正则表达式大全
    js data日期初始化的5种方法
    javascript和jquey的自定义事件小结
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10822926.html
Copyright © 2011-2022 走看看