답안 #631888

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
631888 2022-08-19T05:09:13 Z AA_Surely Dabbeh (INOI20_dabbeh) C++14
25 / 100
1726 ms 159660 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 = 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;
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 22 ms 43476 KB Output is correct
2 Correct 409 ms 61040 KB Output is correct
3 Correct 497 ms 56524 KB Output is correct
4 Correct 566 ms 60708 KB Output is correct
5 Correct 574 ms 59104 KB Output is correct
6 Correct 604 ms 63416 KB Output is correct
7 Correct 592 ms 66868 KB Output is correct
8 Correct 587 ms 64548 KB Output is correct
9 Correct 545 ms 62392 KB Output is correct
10 Correct 444 ms 48892 KB Output is correct
11 Correct 447 ms 105884 KB Output is correct
12 Correct 368 ms 73260 KB Output is correct
13 Correct 398 ms 91280 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1726 ms 159660 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 43476 KB Output is correct
2 Correct 409 ms 61040 KB Output is correct
3 Correct 497 ms 56524 KB Output is correct
4 Correct 566 ms 60708 KB Output is correct
5 Correct 574 ms 59104 KB Output is correct
6 Correct 604 ms 63416 KB Output is correct
7 Correct 592 ms 66868 KB Output is correct
8 Correct 587 ms 64548 KB Output is correct
9 Correct 545 ms 62392 KB Output is correct
10 Correct 444 ms 48892 KB Output is correct
11 Correct 447 ms 105884 KB Output is correct
12 Correct 368 ms 73260 KB Output is correct
13 Correct 398 ms 91280 KB Output is correct
14 Incorrect 1726 ms 159660 KB Output isn't correct
15 Halted 0 ms 0 KB -