Submission #631882

# Submission time Handle Problem Language Result Execution time Memory
631882 2022-08-19T04:57:17 Z AA_Surely Dabbeh (INOI20_dabbeh) C++17
25 / 100
1555 ms 132948 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 + 7;
const int LOG = 20;
const int B = 313;
const int MOD = 998'244'353;
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;
}
# Verdict Execution time Memory Grader output
1 Correct 21 ms 37204 KB Output is correct
2 Correct 432 ms 54992 KB Output is correct
3 Correct 461 ms 50560 KB Output is correct
4 Correct 523 ms 54476 KB Output is correct
5 Correct 522 ms 53004 KB Output is correct
6 Correct 584 ms 57308 KB Output is correct
7 Correct 551 ms 60752 KB Output is correct
8 Correct 551 ms 58496 KB Output is correct
9 Correct 547 ms 56184 KB Output is correct
10 Correct 396 ms 42612 KB Output is correct
11 Correct 353 ms 101872 KB Output is correct
12 Correct 334 ms 69292 KB Output is correct
13 Correct 328 ms 87460 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 1555 ms 132948 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 21 ms 37204 KB Output is correct
2 Correct 432 ms 54992 KB Output is correct
3 Correct 461 ms 50560 KB Output is correct
4 Correct 523 ms 54476 KB Output is correct
5 Correct 522 ms 53004 KB Output is correct
6 Correct 584 ms 57308 KB Output is correct
7 Correct 551 ms 60752 KB Output is correct
8 Correct 551 ms 58496 KB Output is correct
9 Correct 547 ms 56184 KB Output is correct
10 Correct 396 ms 42612 KB Output is correct
11 Correct 353 ms 101872 KB Output is correct
12 Correct 334 ms 69292 KB Output is correct
13 Correct 328 ms 87460 KB Output is correct
14 Incorrect 1555 ms 132948 KB Output isn't correct
15 Halted 0 ms 0 KB -