답안 #433227

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
433227 2021-06-19T10:14:40 Z parsabahrami Dabbeh (INOI20_dabbeh) C++17
25 / 100
2000 ms 28776 KB
#include <bits/stdc++.h>
 
using namespace std;

typedef long long int ll;
typedef pair<int, int> pii;
 
#define SZ(x)                       (int) x.size()
#define F                           first
#define S                           second

const int N = 3e5 + 10, MOD[] = {(int) 1e9 + 9, (int) 1e9 + 7};
int pw[2][N], H[2][N], dp[20][N], rmq[20][20][N], lg[N], n, m, q, base[] = {37, 31}; set<pii> st;
char S[N * 2]; 

pii get_hash(int l, int r) {
    pii h = {(H[0][r] - 1ll * H[0][l - 1] * pw[0][r - l + 1] % MOD[0] + MOD[0]) % MOD[0], 
        (H[1][r] - 1ll * H[1][l - 1] * pw[1][r - l + 1] % MOD[1] + MOD[1]) % MOD[1]};
    return h;
}

void build_rmq(int id) {
    for (int i = 1; i <= n; i++) {
        rmq[id][0][i] = dp[id][i];
    }
    for (int i = 1; i < 20; i++) {
        for (int j = 1; j <= n; j++) {
            if (j + (1 << i) <= n + 1) {
                rmq[id][i][j] = max(rmq[id][i - 1][j], rmq[id][i - 1][j + (1 << (i - 1))]);
            }
        }
    }
}

int get_max(int id, int l, int r) {
    if (r <= l) return l;
    r = min(r, n + 1);
    int x = lg[r - l];
    return max(rmq[id][x][l], rmq[id][x][r - (1 << x)]);
}

int main() {
    for (int i = 2; i < N; i++) 
        lg[i] = lg[i >> 1] + 1;
    pw[0][0] = pw[1][0] = 1;
    for (int i = 1; i < N; i++) 
        for (int j : {0, 1})
            pw[j][i] = 1ll * pw[j][i - 1] * base[j] % MOD[j];
    scanf("%d%d", &n, &q);
    for (int i = 1; i <= n; i++) {
        scanf("%s", S);
        pii h = {0, 0};
        for (int j = 0; S[j]; j++) {
            h = {(1ll * h.F * base[0] % MOD[0] + S[j] - 'a' + 1) % MOD[0], 
                (1ll * h.S * base[1] % MOD[1] + S[j] - 'a' + 1) % MOD[1]};
            st.insert(h);
        }
    }
    scanf("%s", S + 1); m = strlen(S + 1);
    for (int i = 1; i <= m; i++) {
        for (int j : {0, 1}) 
            H[j][i] = (1ll * H[j][i - 1] * base[j] % MOD[j] + S[i] - 'a' + 1) % MOD[j];
    }
    swap(n, m);
    for (int i = 1; i <= n; i++) {
        int l = i - 1, r = n + 1;
        while (r - l > 1) {
            int md = (l + r) >> 1;
            if (st.find(get_hash(i, md)) != st.end()) l = md;
            else r = md;
        }
        dp[0][i] = l + 1;
    }
    for (int j = 1; j < 20; j++) {
        build_rmq(j - 1);
        for (int i = 1; i <= n; i++) {
            dp[j][i] = get_max(j - 1, i, dp[j - 1][i] + 1);
        }
    }
    for (build_rmq(19); q; q--) {
        int l, r; scanf("%d%d", &l, &r); l++;
        int ret = 0, p = l;
        for (int i = 19; ~i; i--) {
            if (get_max(i, l, p + 1) <= r) ret += 1 << i, p = get_max(i, l, p + 1);
        }
        printf("%d\n", ret > n ? -1 : ret + 1);
    }
    return 0;
}

Compilation message

Main.cpp: In function 'int main()':
Main.cpp:49:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   49 |     scanf("%d%d", &n, &q);
      |     ~~~~~^~~~~~~~~~~~~~~~
Main.cpp:51:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   51 |         scanf("%s", S);
      |         ~~~~~^~~~~~~~~
Main.cpp:59:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   59 |     scanf("%s", S + 1); m = strlen(S + 1);
      |     ~~~~~^~~~~~~~~~~~~
Main.cpp:81:24: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   81 |         int l, r; scanf("%d%d", &l, &r); l++;
      |                   ~~~~~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 4428 KB Output is correct
2 Correct 497 ms 23368 KB Output is correct
3 Correct 376 ms 18756 KB Output is correct
4 Correct 432 ms 23364 KB Output is correct
5 Correct 433 ms 22036 KB Output is correct
6 Correct 527 ms 26248 KB Output is correct
7 Correct 595 ms 28776 KB Output is correct
8 Correct 611 ms 27460 KB Output is correct
9 Correct 519 ms 25336 KB Output is correct
10 Correct 193 ms 10692 KB Output is correct
11 Correct 533 ms 27032 KB Output is correct
12 Correct 251 ms 15788 KB Output is correct
13 Correct 392 ms 21952 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 2071 ms 15036 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 4428 KB Output is correct
2 Correct 497 ms 23368 KB Output is correct
3 Correct 376 ms 18756 KB Output is correct
4 Correct 432 ms 23364 KB Output is correct
5 Correct 433 ms 22036 KB Output is correct
6 Correct 527 ms 26248 KB Output is correct
7 Correct 595 ms 28776 KB Output is correct
8 Correct 611 ms 27460 KB Output is correct
9 Correct 519 ms 25336 KB Output is correct
10 Correct 193 ms 10692 KB Output is correct
11 Correct 533 ms 27032 KB Output is correct
12 Correct 251 ms 15788 KB Output is correct
13 Correct 392 ms 21952 KB Output is correct
14 Execution timed out 2071 ms 15036 KB Time limit exceeded
15 Halted 0 ms 0 KB -