답안 #631898

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
631898 2022-08-19T05:22:38 Z AA_Surely Dabbeh (INOI20_dabbeh) C++14
25 / 100
1874 ms 166768 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 = 1e6 + 2;
const int N = 5e5 + 2;
const int M = 5e5 + 2;
const int LOG = 25;
const int B = 313;
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, 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 23 ms 43604 KB Output is correct
2 Correct 465 ms 62280 KB Output is correct
3 Correct 546 ms 57892 KB Output is correct
4 Correct 603 ms 62008 KB Output is correct
5 Correct 590 ms 60308 KB Output is correct
6 Correct 631 ms 64636 KB Output is correct
7 Correct 635 ms 67964 KB Output is correct
8 Correct 629 ms 65504 KB Output is correct
9 Correct 632 ms 63208 KB Output is correct
10 Correct 473 ms 49564 KB Output is correct
11 Correct 466 ms 106292 KB Output is correct
12 Correct 403 ms 73816 KB Output is correct
13 Correct 437 ms 91760 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1825 ms 160804 KB Output is correct
2 Incorrect 1874 ms 166768 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 43604 KB Output is correct
2 Correct 465 ms 62280 KB Output is correct
3 Correct 546 ms 57892 KB Output is correct
4 Correct 603 ms 62008 KB Output is correct
5 Correct 590 ms 60308 KB Output is correct
6 Correct 631 ms 64636 KB Output is correct
7 Correct 635 ms 67964 KB Output is correct
8 Correct 629 ms 65504 KB Output is correct
9 Correct 632 ms 63208 KB Output is correct
10 Correct 473 ms 49564 KB Output is correct
11 Correct 466 ms 106292 KB Output is correct
12 Correct 403 ms 73816 KB Output is correct
13 Correct 437 ms 91760 KB Output is correct
14 Correct 1825 ms 160804 KB Output is correct
15 Incorrect 1874 ms 166768 KB Output isn't correct
16 Halted 0 ms 0 KB -