답안 #1002642

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1002642 2024-06-19T17:23:42 Z vjudge1 Dabbeh (INOI20_dabbeh) C++17
25 / 100
2000 ms 63376 KB
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define ll long long
#define pii pair<int, int>
#define all(v) v.begin(), v.end()
#define oo 1e9
const ll MAX = 5e5 + 5, B = 61, MOD = (1ll << 61) - 1, LOGMAX = 21;
struct ST{
    pii tree[4 * MAX];
    void init(){
        for(int i = 0; i < 4 * MAX; i++) tree[i] = {0, 0};
    }
    void update(int node, int l, int r, int pos, pii val){
        if(l == r){
            tree[node] = val;
            return;
        }
        int mid = (l + r) / 2;
        if(pos <= mid) update(2 * node, l, mid, pos, val);
        else update(2 * node + 1, mid + 1, r, pos, val);
        tree[node] = max(tree[2 * node], tree[2 * node + 1]);
    }
    pii ask(int node, int l, int r, int ql, int qr){
        if(qr < l || r < ql) return {0, 0};
        if(ql <= l && r <= qr) return tree[node];
        int mid = (l + r) / 2;
        return max(ask(2 * node, l, mid, ql, qr), ask(2 * node + 1, mid + 1, r, ql, qr));
    }
};
ll binpow(ll a, ll b){
    if(b == 0) return 1;
    if(b & 1) return (__int128_t)binpow(a, b - 1) % MOD * a % MOD;
    return binpow((__int128_t)a * a % MOD, b / 2) % MOD;
}
ll inv(ll a){
    return binpow(a, MOD - 2);
}
int n, q;
string s;
string t[MAX];

vector<ll> mp;
ll pre[MAX];
ll P[(int)5e5 + 5];
ll invP[(int)5e5 + 5];
int par[LOGMAX][MAX];
int nxt[MAX];
ST st;

int calc(int l, int r){
    return (__int128_t)(pre[r] - pre[l - 1] + MOD) % MOD * invP[l - 1] % MOD;
}

void solve(){
    P[0]= 1;
    invP[0] = 1;
    for(int i = 1; i <= 5e5; i++){
        P[i] = (__int128_t)P[i - 1] * B % MOD;
        invP[i] = (__int128_t)invP[i - 1] * inv(B) % MOD;
    }
    cin >> n >> q;
    for(int i = 1; i <= n; i++){
        cin >> t[i];
        ll H = 0;
        for(int j = 0; j < t[i].size(); j++){
            H = (__int128_t)(H + (__int128_t)(t[i][j] - 'a' + 1) * P[j] % MOD) % MOD;
            mp.push_back(H);
        }
    }
    cin >> s;
    n = s.size();
    for(int i = 1; i <= n; i++){
        pre[i] = (__int128_t)(pre[i - 1] + (__int128_t)(s[i - 1] - 'a' + 1) * P[i - 1] % MOD) % MOD;
    }
    st.init();
    st.update(1, 1, n + 1, n + 1, {n + 1, n + 1});
    par[0][n + 1] = n + 1;
    nxt[n + 1] = n + 1;
    for(int i = n; i >= 1; i--){
        if(find(mp.begin(), mp.end(), calc(i, i)) == mp.end()){
            par[0][i] = i;
            nxt[i] = i;
            st.update(1, 1, n + 1, i, {i, i});
            continue;
        }
        int l = i, r = n;
        while(l < r){
            int mid = (l + r + 1) / 2;
            if(find(mp.begin(), mp.end(), calc(i, mid)) != mp.end()) l = mid;
            else r = mid - 1;
        }
        par[0][i] = st.ask(1, 1, n + 1, i + 1, l + 1).second;
        nxt[i] = l + 1;
        st.update(1, 1, n + 1, i, {l + 1, i});
    }
    for(int j = 1; j < LOGMAX; j++){
        for(int i = 1; i <= n + 1; i++){
            par[j][i] = par[j - 1][par[j - 1][i]];
        }
    }
    while(q--){
        int l, r; cin >> l >> r;
        l++;
        if(nxt[l] > r){
            cout << "1\n";
            continue;
        }
        ll ans = 0;
        for(int i = LOGMAX - 1; i >= 0; i--){
            if(nxt[par[i][l]] <= r){
                ans += (1ll << i);
                l = par[i][l];
            }
        }
        if(nxt[par[0][l]] <= r) cout << "-1\n";
        else cout << ans + 2 << '\n';
    }
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    while(t--){
        solve();
    }
}

Compilation message

Main.cpp: In function 'void solve()':
Main.cpp:68:26: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |         for(int j = 0; j < t[i].size(); j++){
      |                        ~~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 655 ms 55176 KB Output is correct
2 Correct 703 ms 61620 KB Output is correct
3 Correct 763 ms 61132 KB Output is correct
4 Correct 910 ms 62176 KB Output is correct
5 Correct 941 ms 61936 KB Output is correct
6 Correct 1024 ms 62992 KB Output is correct
7 Correct 1070 ms 63376 KB Output is correct
8 Correct 1050 ms 63168 KB Output is correct
9 Correct 969 ms 62472 KB Output is correct
10 Correct 765 ms 59280 KB Output is correct
11 Correct 673 ms 62668 KB Output is correct
12 Correct 670 ms 59724 KB Output is correct
13 Correct 655 ms 61624 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 2047 ms 60280 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 655 ms 55176 KB Output is correct
2 Correct 703 ms 61620 KB Output is correct
3 Correct 763 ms 61132 KB Output is correct
4 Correct 910 ms 62176 KB Output is correct
5 Correct 941 ms 61936 KB Output is correct
6 Correct 1024 ms 62992 KB Output is correct
7 Correct 1070 ms 63376 KB Output is correct
8 Correct 1050 ms 63168 KB Output is correct
9 Correct 969 ms 62472 KB Output is correct
10 Correct 765 ms 59280 KB Output is correct
11 Correct 673 ms 62668 KB Output is correct
12 Correct 670 ms 59724 KB Output is correct
13 Correct 655 ms 61624 KB Output is correct
14 Execution timed out 2047 ms 60280 KB Time limit exceeded
15 Halted 0 ms 0 KB -