답안 #631892

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
631892 2022-08-19T05:16:39 Z AA_Surely Dabbeh (INOI20_dabbeh) C++14
25 / 100
659 ms 105884 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 decond
#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 = 500 + 2;
const int N = 5e5 + 2;
const int M = 5e5 + 2;
const int LOG = 25;
const int B = 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[L], pw[L];
unordered_set<int> 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) {
    LL h = 0;
    F0R(i, (int)ts[id].length()) {
        h = (h * B + ts[id][i]) % MOD;
        keep[i + 1].insert(h);
    }

    return;
}

void mainHash() {
    hsh[0] = s[0];
    pw[0] = 1;

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

    return;
}

inline LL getH(int l, int r) {
    if (!l) return hsh[r];
    return (hsh[r] - (hsh[l - 1] * pw[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;
    int ans = INF, sum = 0;

    R0F(i, LOG) {
        int x = dp[i].get(l, now);
        if (x > r) 
            ans = min(ans, sum + (1 << i));
        else {
            sum += (1 << i);
            now = x;
        }
    }
    
    cout << (ans == INF ? -1 : ans) << 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 21 ms 43588 KB Output is correct
2 Correct 434 ms 60928 KB Output is correct
3 Correct 535 ms 56524 KB Output is correct
4 Correct 601 ms 60488 KB Output is correct
5 Correct 590 ms 59032 KB Output is correct
6 Correct 617 ms 63180 KB Output is correct
7 Correct 659 ms 66896 KB Output is correct
8 Correct 629 ms 64640 KB Output is correct
9 Correct 585 ms 62352 KB Output is correct
10 Correct 466 ms 48588 KB Output is correct
11 Correct 461 ms 105884 KB Output is correct
12 Correct 403 ms 73260 KB Output is correct
13 Correct 436 ms 91220 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 86 ms 102992 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 21 ms 43588 KB Output is correct
2 Correct 434 ms 60928 KB Output is correct
3 Correct 535 ms 56524 KB Output is correct
4 Correct 601 ms 60488 KB Output is correct
5 Correct 590 ms 59032 KB Output is correct
6 Correct 617 ms 63180 KB Output is correct
7 Correct 659 ms 66896 KB Output is correct
8 Correct 629 ms 64640 KB Output is correct
9 Correct 585 ms 62352 KB Output is correct
10 Correct 466 ms 48588 KB Output is correct
11 Correct 461 ms 105884 KB Output is correct
12 Correct 403 ms 73260 KB Output is correct
13 Correct 436 ms 91220 KB Output is correct
14 Runtime error 86 ms 102992 KB Execution killed with signal 11
15 Halted 0 ms 0 KB -