字符串哈希——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