Submission #632703

# Submission time Handle Problem Language Result Execution time Memory
632703 2022-08-20T16:19:26 Z AA_Surely Dabbeh (INOI20_dabbeh) C++17
25 / 100
2000 ms 128476 KB
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")

#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 second
#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 + 7;
const int L = 1e6 + 7;
const int Q = 1e4 + 7;
const int LOG = 20;
const char C = ' ';

#define endl '\n'
#define lc now << 1
#define rc now << 1 | 1

int q, m, n, pw, len;
int tmp[N], moj[L];
int rnk[LOG][L];
PII p[L];
string ts[Q], s, ns;

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];
        ns += C + ts[i];
    }

    cin >> s;
    n = s.length();

    ns += C + s;
    len = ns.length();
}

inline bool cmp(const PII &a, const PII &b) {
    if (rnk[pw - 1][a.F] != rnk[pw - 1][b.F]) return (rnk[pw - 1][a.F] < rnk[pw - 1][b.F]);
    if (max(a.F, b.F) + (1 << (pw - 1)) >= len) return (a.F > b.F);
    return (rnk[pw - 1][a.F + (1 << (pw - 1))] < rnk[pw - 1][b.F + (1 << (pw - 1))]);
}

void buildSA() {
    int c = -1;
    F0R(i, len) {
        rnk[0][i] = ns[i];
        p[i].F = i;
        if (i && ns[i - 1] == C) p[i].S = c--;
    }

    c = n;
    R0F(i, len) {
        if (ns[i] == C) break;
        p[i].S = c--;
    }

    for(pw = 1; pw < LOG; pw++) {
        sort(p, p + len, cmp);

        rnk[pw][ p[0].F ] = 0;
        FOR(i, 1, len) rnk[pw][ p[i].F ] = rnk[pw][ p[i - 1].F ] + cmp(p[i - 1], p[i]);
    }
    
    return;
}

inline int lcp(int a, int b) {
    int ret = 0;
    R0F(i, LOG) {
        if (max(a, b) + (1 << i) > len || rnk[i][a] != rnk[i][b]) continue;

        ret |= (1 << i);
        a += (1 << i);
        b += (1 << i);
    }

    return ret;
}

void dpBase() {
    FOR(i, 1, len) moj[i] = lcp(p[i - 1].F, p[i].F);
    int mx = 0;

    FOR(i, 1, len) {
        mx = min(mx, moj[i]);

        if (p[i].S < 0) 
            mx = ts[ -p[i].S - 1 ].length();
        if (p[i].S > 0)
            tmp[ p[i].S - 1 ] = mx;
    }

    mx = 0;
    R0F(i, len) {
        mx = min(mx, moj[i + 1]);
        if (p[i].S < 0) 
            mx = ts[ -p[i].S - 1 ].length();
        if (p[i].S > 0) 
            tmp[ p[i].S - 1 ] = max(tmp[ p[i].S - 1], mx);
    }

    F0R(i, n + 1) tmp[i] += i;
    dp[0].build();

    return;
}

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();
 
    buildSA();
    dpBase();
 
    FOR(i, 1, LOG) calcLayer(i);
    while(m--) handleQuery();
 
    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 852 KB Output is correct
2 Correct 883 ms 37680 KB Output is correct
3 Correct 714 ms 27588 KB Output is correct
4 Correct 915 ms 38192 KB Output is correct
5 Correct 909 ms 33032 KB Output is correct
6 Correct 1043 ms 44116 KB Output is correct
7 Correct 1099 ms 46008 KB Output is correct
8 Correct 1080 ms 47208 KB Output is correct
9 Correct 983 ms 40808 KB Output is correct
10 Correct 483 ms 11976 KB Output is correct
11 Correct 764 ms 41912 KB Output is correct
12 Correct 491 ms 20644 KB Output is correct
13 Correct 686 ms 32332 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1945 ms 128476 KB Output is correct
2 Execution timed out 2071 ms 116796 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 852 KB Output is correct
2 Correct 883 ms 37680 KB Output is correct
3 Correct 714 ms 27588 KB Output is correct
4 Correct 915 ms 38192 KB Output is correct
5 Correct 909 ms 33032 KB Output is correct
6 Correct 1043 ms 44116 KB Output is correct
7 Correct 1099 ms 46008 KB Output is correct
8 Correct 1080 ms 47208 KB Output is correct
9 Correct 983 ms 40808 KB Output is correct
10 Correct 483 ms 11976 KB Output is correct
11 Correct 764 ms 41912 KB Output is correct
12 Correct 491 ms 20644 KB Output is correct
13 Correct 686 ms 32332 KB Output is correct
14 Correct 1945 ms 128476 KB Output is correct
15 Execution timed out 2071 ms 116796 KB Time limit exceeded
16 Halted 0 ms 0 KB -