Submission #1347244

#TimeUsernameProblemLanguageResultExecution timeMemory
1347244ender_shayanDabbeh (INOI20_dabbeh)C++20
100 / 100
510 ms99572 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double	ld;
typedef pair<int, int>	pii  ;
typedef pair<ll, ll>	pll  ;
typedef vector<pii>     vii  ;
typedef vector<int>     veci ;
typedef vector<pll>     vll  ;
typedef vector<ll>      vecll;

// find_by_order             order_of_key

//#pragma GCC optimize("O3,unroll-loops")
//#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
#define S		        second
#define pb		        push_back
#define endl            '\n'
#define Mp		        make_pair
#define all(x)          x.begin(), x.end()
#define debug(x)        cerr << #x << " = " << x << endl
#define set_dec(x)	    cout << fixed << setprecision(x);
#define fast_io         ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define file_io         freopen("in.txt" , "r" , stdin) ; freopen("out.txt" , "w" , stdout);
#define lb              lower_bound
#define ub              upper_bound
#define for1(n)         for(int i=1;i<=n;i++)
#define for0(n)         for(int i=0;i<n;i++)
#define forn(n)         for(int i=n;i>0;i--)
#define pq              priority_queue <pii, vector<pii>, greater<pii>>


const ll mod =  1e9+9;

const int N=5e5+10,bs=701,L=20,bs2=719;
int n,m,k,q,rmq[N][L],mx[N][L];
vector<pii> vec[N];
ll pw[N],pre[N],inv[N],pw2[N],inv2[N],pre2[N];
pii seg[N*4];
typedef unsigned long long ull;
typedef __uint128_t LL;
struct FastMod {
	ull b, m;
	FastMod(ull b) : b(b), m(ull((LL(1) << 64) / b)) {}
	ull red(ull a) {
		ull q = (ull)((LL(m) * a) >> 64);
		ull r = a - q * b;
		return r >= b ? r - b : r;
	}
};
FastMod F(mod);
void upd(int i,int l=0,int r=n,int v=1){
    if(r-l==1){
        seg[v]={mx[i][0],i};
        return;
    }
    int mid=(l+r)>>1;
    if(i<mid)upd(i,l,mid,v<<1);
    else upd(i,mid,r,v<<1|1);
    seg[v]=max(seg[v<<1],seg[v<<1|1]);
}
pii get(int lx,int rx,int l=0,int r=n,int v=1){
    if(lx>=r || rx<=l)return {0,0};
    if(lx<=l && r<=rx)return seg[v];
    int mid=(l+r)>>1;
    return max(get(lx,rx,l,mid,v<<1),get(lx,rx,mid,r,v<<1|1));
}
ll px(ll a,ll b){
    ll ans=1;
    while(b){
        if(b&1)ans=F.red(ans*a);
        b>>=1;
        a=F.red(a*a);
    }
    return ans;
}
int main(){
    fast_io
    pw[0]=pw2[0]=1;
    for1(N-1){
        pw[i]=F.red(pw[i-1]*bs);
        pw2[i]=F.red(pw2[i-1]*bs2);
    }
    inv[N-1]=px(pw[N-1],mod-2);
    inv2[N-1]=px(pw2[N-1],mod-2);
    for(int i=N-2;i>=0;i--){
        inv[i]=F.red(inv[i+1]*bs);
        inv2[i]=F.red(inv2[i+1]*bs2);
    }
    cin>>m>>q;
    for1(m){
        string s;cin>>s;
        ll hs=0,hs2=0;;
        for0(s.size()){hs=F.red(hs+pw[i]*s[i]);hs2=F.red(hs2+pw2[i]*s[i]);vec[i].pb({hs,hs2});}
    }
    string s;cin>>s;n=s.size();
    for0(n){
        sort(all(vec[i]));vec[i].resize(unique(all(vec[i]))-vec[i].begin());
        vec[i].pb({mod,mod});
    }
    for0(n){pre[i]=F.red((i==0 ? 0:pre[i-1])+pw[i]*s[i]);pre2[i]=F.red((i==0 ? 0:pre2[i-1])+pw2[i]*s[i]);}
    for(int i=n-1;i>=0;i--){
        int l=i-1,r=n;
        while(r-l!=1){
            int mid=(l+r)>>1;
            ll hs=F.red((pre[mid]-(i==0 ? 0:pre[i-1])+mod)*inv[i]),hs2=F.red((pre2[mid]-(i==0 ? 0:pre2[i-1])+mod)*inv2[i]);
            if(Mp(int(hs),int(hs2))==(*lb(all(vec[mid-i]),Mp(int(hs),int(hs2)))))l=mid;
            else r=mid;
        }
        mx[i][0]=l+1;
        upd(i);
        rmq[i][0]=get(i,mx[i][0]+1).S;
    }
    for0(L)rmq[n][i]=mx[n][i]=n;
    for(int j=1;j<L;j++)for0(n){
        mx[i][j]=max(mx[i][j-1],mx[rmq[i][j-1]][j-1]);
        rmq[i][j]=rmq[rmq[i][j-1]][j-1];
    }

    while(q--){
        int l,r;cin>>l>>r;r--;
        int ans=1;
        for(int j=L-1;j>=0;j--)if(mx[l][j]<=r){
            ans+=1<<j;
            l=rmq[l][j];
        }
        if(mx[l][0]<=r){
            ans++;
            l=rmq[l][0];
        }
        if(mx[l][0]<=r)ans=-1;
//        for0(n){
//            if(mx[l][0]>r)break;
//            ans++;
//            l=rmq[l][0];
//        }
        if(mx[l][0]<=r)ans=-1;
        cout<<ans<<endl;
    }




}



#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...