首页 > 其他 > 详细

字符串哈希——1056E

时间:2019-05-06 23:40:25      阅读:243      评论:0      收藏:0      [点我收藏+]

典型的字符串哈希题

#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;
}

 

字符串哈希——1056E

原文:https://www.cnblogs.com/zsben991126/p/10822926.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!