Quick actions

cmd+k|ctrl+k

Navigation

Languages

String_hashing_pattern_matching

Snippet info

Language

Cpp

Visibility

public

Author

karthik.pasupulatei

Created

2021-06-25T02:41:24.146999Z

Updated

2021-06-25T02:41:24.146999Z

// Problem: E. Check Transcription
// Contest: Codeforces - Mail.Ru Cup 2018 Round 3
// URL: https://codeforces.com/problemset/problem/1056/E
// Memory Limit: 256 MB
// Time Limit: 3000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include "bits/stdc++.h"
using namespace std;

using ll = long long;
using ld = long double;
//using li = __int128_t ; g++ compiler provides 128bit  - (-2^127  to 2^127-1)
#define pb emplace_back
#define mp make_pair
#define mt make_tuple
#define lwb lower_bound
#define upb upper_bound
#define F first
#define S second
#define I insert
#define P pair<ll, ll>
#define graph unordered_map<ll ,vector<ll>> 
#define all(x) x.begin(), x.end()
#define repv(i, begin, end) for (__typeof(end) i = (begin) - ((begin) > (end)); i != (end) - ((begin) > (end)); i += 1 - 2 * ((begin) > (end)))
#define rep(i, a, b) for(int i = a; i < b; i++)
#define printv(v) for(auto x : v) cout << x << " ";
#define printa(a, n) for(int i = 0; i < n; i++) cout << a[i] << " ";
#define scana(a, n) for(int i = 0; i < n; i++) cin >> a[i];
#define init1(a, x, n) for(int i = 0; i < n; i++) a[i] = x;
#define init2(a, x, n, m) for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) a[i][j] = x;
#define bits(n) __builtin_popcountll(n)
#define setpr(n) fixed << setprecision(n)
#define gcd(a, b) __gcd(a, b) 
#define nextPermut(x) next_permutation(x.begin(), x.end())
#define nl "\n"
#define FIO ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define printOK cout << "👍\n" ; 
const ll mod = 1000000007, maxn = 2e5 + 5;
inline ll add(ll a, ll b, ll m) { return (((a % m) + (b % m)) % m); }
inline ll mul(ll a, ll b, ll m) { return (((a % m) * (b % m)) % m); }
inline ll sub(ll a, ll b, ll m) { return (((a % m) - (b % m) + m) % m); }
using namespace std ; 


const ll M  = 1e9 + 9  , p = 9973  , MS = 1000001; 
ll H[MS]; 
ll Pow[MS] ;
ll n, N; 

void gen_hash(string t ){
	H[0] = 1; 
	for(ll i = 1 ; i <=N ; i++){
		H[i] = ((H[i-1]*p)%M + t[i-1])%M ; 
	}
}
void gen_pow(){
	Pow[0] =1 ; 
	for(ll i = 1 ; i < MS ; i++){
		Pow[i] = (Pow[i-1]*p)%M ; 
	}
} 
ll getHash(int a , int b ){
	return (H[b+1] - (H[a]*Pow[b-a+1])%M + M )%M ;
}
ll Count(string s , char chr ){
	ll retVal = 0 ; 
	for(auto &c : s ){
		if(c == chr)retVal++; 
	}
	return retVal ; 
}
int main(){
    FIO
    string s , t ;
    cin >> s  >> t ;
    n = s.size(); 
    N = t.size(); 
    gen_hash(t) ; 
    gen_pow() ;
    ll count0 = Count(s, '0'), count1  = Count(s,'1');   
    
    set<pair<int,int>> satLens ; 
    for(int i = 1 ; i < N ;i++){//0
    	int req  =  N-(count0)*i ;
    	if(req > 0 && req%count1 == 0) 
    		satLens.insert({i,req/count1}); 
    }
    
    for(int i = 1 ; i < N ; i++){//1
    	ll req =N-(count1*i) ; 
    	if (req > 0 && req%count0 == 0 )
    		satLens.insert({req/count0,i}) ; 
    }
    // I have the pairs that satisfy the length
    ll retVal =  0 ; 
    for(auto &c : satLens){

    	ll r0 = -1 , r1 = -1 ; 
    	bool got = true ; 
    	ll j = 0 , i = 0  ; 
    	for(i = 0 ;i < n && j < N ; i++){
    		if(s[i] == '0'){
    			if(r0 != -1){
    				if(j+c.first > N || r0 != getHash(j,j+c.first-1)){
    					got = false ; 
    					break  ; 	
    				}
    			}else r0  = getHash(j,j+c.first-1) ; 
    			j = j+c.first ;
    			
    		}else{
    			if(r1 != -1){
    				if(j+c.second > N ||r1 != getHash(j,j+c.second-1)){got = false ;break ; }
    			}else r1  =getHash(j,j+c.second-1); 
    			
    			j = j+c.second ; 
    		}
    	}
    	
    	if(got && r0 != r1 )retVal++ ;
    }
    cout << retVal << "\n" ; 
    return 0 ; 
}
INFO