답안 #631884

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
631884 2022-08-19T04:59:34 Z AA_Surely Dabbeh (INOI20_dabbeh) C++14
25 / 100
1645 ms 140844 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 N = 3e5 + 2;
const int M = 5e5 + 2;
const int LOG = 22;
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;
int tmp[N];
LL hsh[N], pw[N];
string ts[N], s;
unordered_set<int> keep[M];

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 20 ms 37204 KB Output is correct
2 Correct 408 ms 54756 KB Output is correct
3 Correct 494 ms 50288 KB Output is correct
4 Correct 533 ms 54216 KB Output is correct
5 Correct 535 ms 52716 KB Output is correct
6 Correct 593 ms 57052 KB Output is correct
7 Correct 578 ms 60552 KB Output is correct
8 Correct 650 ms 58260 KB Output is correct
9 Correct 519 ms 56020 KB Output is correct
10 Correct 406 ms 42468 KB Output is correct
11 Correct 366 ms 99540 KB Output is correct
12 Correct 323 ms 66856 KB Output is correct
13 Correct 354 ms 84900 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1645 ms 140844 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 37204 KB Output is correct
2 Correct 408 ms 54756 KB Output is correct
3 Correct 494 ms 50288 KB Output is correct
4 Correct 533 ms 54216 KB Output is correct
5 Correct 535 ms 52716 KB Output is correct
6 Correct 593 ms 57052 KB Output is correct
7 Correct 578 ms 60552 KB Output is correct
8 Correct 650 ms 58260 KB Output is correct
9 Correct 519 ms 56020 KB Output is correct
10 Correct 406 ms 42468 KB Output is correct
11 Correct 366 ms 99540 KB Output is correct
12 Correct 323 ms 66856 KB Output is correct
13 Correct 354 ms 84900 KB Output is correct
14 Incorrect 1645 ms 140844 KB Output isn't correct
15 Halted 0 ms 0 KB -