제출 #1280627

#제출 시각아이디문제언어결과실행 시간메모리
1280627AlgorithmWarriorBrperm (RMI20_brperm)C++20
100 / 100
321 ms76264 KiB
#include <bits/stdc++.h>

using namespace std;

int const BASE=31;
int const MOD=1e9+7;
int const NMAX=500005;
int const LOG=19;
int bexp[LOG];
int hsh[NMAX][LOG];
int dp[NMAX][LOG];
int nn;

void get_bexp(){
    bexp[0]=BASE;
    int i;
    for(i=1;i<LOG;++i)
        bexp[i]=1LL*bexp[i-1]*bexp[i-1]%MOD;
}

void get_hsh(int n,const char s[]){
    int i,j;
    for(j=0;j<LOG;++j){
        hsh[0][j]=s[0]-'a'+1;
        for(i=1;i<n;++i)
            hsh[i][j]=(1LL*hsh[i-1][j]*bexp[j]%MOD+s[i]-'a'+1)%MOD;
    }
}

void get_dp(int n,const char s[]){
    int i,j;
    for(i=0;i<n;++i)
        dp[i][0]=s[i]-'a'+1;
    for(j=1;j<LOG;++j)
        for(i=0;i+(1<<j)<=n;++i)
            dp[i][j]=(1LL*dp[i][j-1]*bexp[LOG-j-1]%MOD+dp[i+(1<<(j-1))][j-1])%MOD;
}

void init(int n,const char s[]){
    nn=n;
    get_bexp();
    get_hsh(n,s);
    get_dp(n,s);
}

int query(int i,int k){
    if(i+(1<<k)-1>=nn)
        return 0;
    int rez1=hsh[i+(1<<k)-1][LOG-k-1];
    if(i)
        rez1=(rez1-1LL*hsh[i-1][LOG-k-1]*bexp[LOG-1]%MOD+MOD)%MOD;
    int rez2=dp[i][k];
    return (rez1==rez2);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...