답안 #631887

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
631887 2022-08-19T05:01:57 Z AA_Surely Dabbeh (INOI20_dabbeh) C++14
25 / 100
1653 ms 147236 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 = 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 30 ms 43560 KB Output is correct
2 Correct 428 ms 61028 KB Output is correct
3 Correct 485 ms 56648 KB Output is correct
4 Correct 576 ms 60596 KB Output is correct
5 Correct 537 ms 58960 KB Output is correct
6 Correct 628 ms 63244 KB Output is correct
7 Correct 597 ms 66772 KB Output is correct
8 Correct 584 ms 64544 KB Output is correct
9 Correct 519 ms 62192 KB Output is correct
10 Correct 444 ms 48656 KB Output is correct
11 Correct 378 ms 105788 KB Output is correct
12 Correct 336 ms 73184 KB Output is correct
13 Correct 373 ms 91228 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1653 ms 147236 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 30 ms 43560 KB Output is correct
2 Correct 428 ms 61028 KB Output is correct
3 Correct 485 ms 56648 KB Output is correct
4 Correct 576 ms 60596 KB Output is correct
5 Correct 537 ms 58960 KB Output is correct
6 Correct 628 ms 63244 KB Output is correct
7 Correct 597 ms 66772 KB Output is correct
8 Correct 584 ms 64544 KB Output is correct
9 Correct 519 ms 62192 KB Output is correct
10 Correct 444 ms 48656 KB Output is correct
11 Correct 378 ms 105788 KB Output is correct
12 Correct 336 ms 73184 KB Output is correct
13 Correct 373 ms 91228 KB Output is correct
14 Incorrect 1653 ms 147236 KB Output isn't correct
15 Halted 0 ms 0 KB -