cpp-library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub michirakara/cpp-library

:heavy_check_mark: verify/aoj/rolling-hash.test.cpp

Depends on

Code

#define PROBLEM "https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_14_B"

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

#include "../../string/rolling-hash.hpp"

int main(){
    string T,P;cin>>T>>P;
    int base=27+rand()%50;
    RollingHash t(T,base),p(P,base);
    if(T.size()<P.size()){
        exit(0);
    }
    for(int i=0;i<=T.size()-P.size();i++){
        if(t.hash(i,i+P.size())==p.hash(0,P.size()))cout<<i<<endl;
    }
}
#line 1 "verify/aoj/rolling-hash.test.cpp"
#define PROBLEM "https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_14_B"

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

#line 3 "string/rolling-hash.hpp"
using ull=unsigned long long;
struct RollingHash{
    ull MOD=(1ull<<61)-1,MASK31=(1ull<<31)-1,MASK30=(1ull<<30)-1;
    ull base;
    std::vector<ull> li={0},p={1};

    ull _mod(ull x){
        ull xu=x>>61,xd=x&MOD;
        ull res=xu+xd;
        if(res>=MOD)res-=MOD;
        return res;
    }

    ull _mul(ull a,ull b){
        ull au=a>>31,ad=a&MASK31,bu=b>>31,bd=b&MASK31;
        ull mid=ad*bu+au*bd;
        ull midu=mid>>30;
        ull midd=mid&MASK30;
        return _mod(au*bu*2+midu+(midd<<31)+ad*bd);
    }

    RollingHash(std::string s,int base){
        RollingHash::base=base;
        for(int i=1;i<=s.size();i++){
            p.push_back(_mul(p[i-1],base));
            li.push_back((_mul(li[i-1],base)+s[i-1])%MOD);
        }
    }

    ull hash(int l,int r){
        //[l,r)
        return (MOD+li[r]-_mul(li[l],p[r-l]))%MOD;
    }
};
#line 7 "verify/aoj/rolling-hash.test.cpp"

int main(){
    string T,P;cin>>T>>P;
    int base=27+rand()%50;
    RollingHash t(T,base),p(P,base);
    if(T.size()<P.size()){
        exit(0);
    }
    for(int i=0;i<=T.size()-P.size();i++){
        if(t.hash(i,i+P.size())==p.hash(0,P.size()))cout<<i<<endl;
    }
}
Back to top page