답안 #631923

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
631923 2022-08-19T07:26:58 Z AA_Surely Dabbeh (INOI20_dabbeh) C++14
25 / 100
1550 ms 140676 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 = 3e5 + 2;
const int N = 5e5 + 2;
const int M = 5e5 + 2;
const int LOG = 20;
const int B = 47;
const int MOD = 1e9 + 9;
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, 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 27 ms 43476 KB Output is correct
2 Correct 392 ms 62224 KB Output is correct
3 Correct 489 ms 58116 KB Output is correct
4 Correct 556 ms 62400 KB Output is correct
5 Correct 565 ms 60708 KB Output is correct
6 Correct 583 ms 65268 KB Output is correct
7 Correct 602 ms 68848 KB Output is correct
8 Correct 613 ms 66848 KB Output is correct
9 Correct 559 ms 64508 KB Output is correct
10 Correct 430 ms 50496 KB Output is correct
11 Correct 350 ms 107284 KB Output is correct
12 Correct 333 ms 74424 KB Output is correct
13 Correct 350 ms 92392 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1550 ms 140676 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 43476 KB Output is correct
2 Correct 392 ms 62224 KB Output is correct
3 Correct 489 ms 58116 KB Output is correct
4 Correct 556 ms 62400 KB Output is correct
5 Correct 565 ms 60708 KB Output is correct
6 Correct 583 ms 65268 KB Output is correct
7 Correct 602 ms 68848 KB Output is correct
8 Correct 613 ms 66848 KB Output is correct
9 Correct 559 ms 64508 KB Output is correct
10 Correct 430 ms 50496 KB Output is correct
11 Correct 350 ms 107284 KB Output is correct
12 Correct 333 ms 74424 KB Output is correct
13 Correct 350 ms 92392 KB Output is correct
14 Incorrect 1550 ms 140676 KB Output isn't correct
15 Halted 0 ms 0 KB -