답안 #632036

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
632036 2022-08-19T10:33:34 Z AA_Surely Dabbeh (INOI20_dabbeh) C++14
50 / 100
2000 ms 197024 KB
#include <bits/stdc++.h>

#define FOR(i, x, n) for(int i = x; i < n; i++)
#define F0R(i, n) FOR(i, 0, n)
#define ROF(i, x, n) for(int i = n - 1; i >= x; i--)
#define R0F(i, n) ROF(i, 0, n)

#define WTF cout << "WTF" << endl

#define IOS ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define F first
#define S second
#define PB push_back

#define ALL(x) x.begin(), x.end()
#define RALL(x) x.rbegin(), x.rend()

using namespace std;

typedef long long LL;

typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;

typedef vector<int> VI;
typedef vector<LL> VLL;
typedef vector<PII> VPII;
typedef vector<PLL> VPLL;

const int L = 3e5 + 2;
const int N = 5e5 + 2;
const int M = 5e5 + 2;
const int LOG = 20;
const int B[2] = {313, 131};
const int MOD = 1e9 + 7;
const int INF = 1e9 + 7;

#define endl '\n'
#define lc now << 1
#define rc now << 1 | 1

int q, m, n;
LL tmp[L];
LL hsh[2][L], pw[2][L];
unordered_set<LL> keep[M];
string ts[N], s;

struct IntMaxSeg {
    int tree[N << 2];

    int build(int now = 1, int ls = 0, int rs = n) {
        if (ls == rs) return tree[now] = tmp[ls];
        int mid = (ls + rs) >> 1;
        return tree[now] = max(build(lc, ls, mid), build(rc, mid + 1, rs));
    }

    int get(int lq, int rq, int now = 1, int ls = 0, int rs = n) {
        if (rq < lq || rq < ls || rs < lq) return 0;
        if (lq <= ls && rs <= rq) return tree[now];
        int mid = (ls + rs) >> 1;
        return max(get(lq, rq, lc, ls, mid), get(lq, rq, rc, mid + 1, rs));
    }
} dp[LOG];

void init() {
    cin >> q >> m;
    F0R(i, q) cin >> ts[i];

    cin >> s;
    n = s.length();
}

void calcHash(int id) {
    PLL h = {0, 0};
    F0R(i, (int)ts[id].length()) {
        h.F = (h.F * B[0] + ts[id][i]) % MOD;
        h.S = (h.S * B[1] + ts[id][i]) % MOD;
        keep[i + 1].insert(h.F * MOD + h.S);
    }

    return;
}

void mainHash() {

    F0R(k, 2) {
        hsh[k][0] = s[0];
        pw[k][0] = 1;

        FOR(i, 1, n) {
            hsh[k][i] = (hsh[k][i - 1] * B[k] + s[i]) % MOD;
            pw[k][i] = pw[k][i - 1] * B[k] % MOD;
        }
    }

    return;
}

inline LL getH(int l, int r) {
    if (!l) return hsh[0][r] * MOD + hsh[1][r];
    return ((hsh[0][r] - (hsh[0][l - 1] * pw[0][r - l + 1] % MOD) + MOD) % MOD) * MOD + 
            ((hsh[1][r] - (hsh[1][l - 1] * pw[1][r - l + 1] % MOD) + MOD) % MOD);
}

void dpBase() {
    F0R(i, n + 1) {
        int l = i, r = n, mid;
        while(l < r) {
            mid = (l + r) >> 1;
            if (keep[mid - i + 1].count(getH(i, mid))) l = mid + 1;
            else r = mid;
        }

        tmp[i] = l;
    }

    dp[0].build();
}

void calcLayer(int id) {
    F0R(i, n + 1) {
        int x = dp[id - 1].get(i, i);
        tmp[i] = dp[id - 1].get(i, x);
    }

    dp[id].build();
}

void handleQuery() {
    int l, r; 
    cin >> l >> r;
    r--;

    int now = l, sum = 0;
    if (dp[LOG - 1].get(l, l) <= r) {
        cout << -1 << endl;
        return;
    }

    R0F(i, LOG) {
        int x = dp[i].get(l, now);
        if (x <= r) {
            sum += (1 << i);
            now = x;
        }
    }
    
    cout << sum + 1 << endl;
}

int main() {
    IOS;

    init();

    F0R(i, q) calcHash(i);
    mainHash();
    dpBase();

    FOR(i, 1, LOG) calcLayer(i);
    while(m--) handleQuery();

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 43476 KB Output is correct
2 Correct 392 ms 61104 KB Output is correct
3 Correct 481 ms 56616 KB Output is correct
4 Correct 542 ms 60492 KB Output is correct
5 Correct 542 ms 58972 KB Output is correct
6 Correct 591 ms 63328 KB Output is correct
7 Correct 574 ms 66768 KB Output is correct
8 Correct 582 ms 64884 KB Output is correct
9 Correct 528 ms 62520 KB Output is correct
10 Correct 412 ms 48704 KB Output is correct
11 Correct 433 ms 105780 KB Output is correct
12 Correct 345 ms 73140 KB Output is correct
13 Correct 387 ms 91216 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1583 ms 144944 KB Output is correct
2 Correct 1660 ms 150184 KB Output is correct
3 Correct 1588 ms 146304 KB Output is correct
4 Correct 1520 ms 141500 KB Output is correct
5 Correct 1488 ms 141244 KB Output is correct
6 Correct 1638 ms 150920 KB Output is correct
7 Correct 1675 ms 153164 KB Output is correct
8 Correct 1613 ms 148476 KB Output is correct
9 Correct 1662 ms 151624 KB Output is correct
10 Correct 1726 ms 154968 KB Output is correct
11 Correct 1579 ms 146368 KB Output is correct
12 Correct 1590 ms 144996 KB Output is correct
13 Correct 1718 ms 156392 KB Output is correct
14 Correct 1684 ms 154508 KB Output is correct
15 Correct 1511 ms 139536 KB Output is correct
16 Correct 1276 ms 197024 KB Output is correct
17 Correct 1197 ms 155964 KB Output is correct
18 Correct 1208 ms 155320 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 43476 KB Output is correct
2 Correct 392 ms 61104 KB Output is correct
3 Correct 481 ms 56616 KB Output is correct
4 Correct 542 ms 60492 KB Output is correct
5 Correct 542 ms 58972 KB Output is correct
6 Correct 591 ms 63328 KB Output is correct
7 Correct 574 ms 66768 KB Output is correct
8 Correct 582 ms 64884 KB Output is correct
9 Correct 528 ms 62520 KB Output is correct
10 Correct 412 ms 48704 KB Output is correct
11 Correct 433 ms 105780 KB Output is correct
12 Correct 345 ms 73140 KB Output is correct
13 Correct 387 ms 91216 KB Output is correct
14 Correct 1583 ms 144944 KB Output is correct
15 Correct 1660 ms 150184 KB Output is correct
16 Correct 1588 ms 146304 KB Output is correct
17 Correct 1520 ms 141500 KB Output is correct
18 Correct 1488 ms 141244 KB Output is correct
19 Correct 1638 ms 150920 KB Output is correct
20 Correct 1675 ms 153164 KB Output is correct
21 Correct 1613 ms 148476 KB Output is correct
22 Correct 1662 ms 151624 KB Output is correct
23 Correct 1726 ms 154968 KB Output is correct
24 Correct 1579 ms 146368 KB Output is correct
25 Correct 1590 ms 144996 KB Output is correct
26 Correct 1718 ms 156392 KB Output is correct
27 Correct 1684 ms 154508 KB Output is correct
28 Correct 1511 ms 139536 KB Output is correct
29 Correct 1276 ms 197024 KB Output is correct
30 Correct 1197 ms 155964 KB Output is correct
31 Correct 1208 ms 155320 KB Output is correct
32 Execution timed out 2087 ms 98392 KB Time limit exceeded
33 Halted 0 ms 0 KB -