답안 #433226

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
433226 2021-06-19T10:13:20 Z parsabahrami Dabbeh (INOI20_dabbeh) C++17
25 / 100
2000 ms 38876 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}; map<pii, int> mp;
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]};
            mp[h] = 1;
        }
    }
    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 (mp.count(get_hash(i, md))) 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 5 ms 4416 KB Output is correct
2 Correct 462 ms 29288 KB Output is correct
3 Correct 382 ms 23144 KB Output is correct
4 Correct 523 ms 29060 KB Output is correct
5 Correct 435 ms 27204 KB Output is correct
6 Correct 592 ms 35600 KB Output is correct
7 Correct 704 ms 38876 KB Output is correct
8 Correct 624 ms 37256 KB Output is correct
9 Correct 533 ms 34468 KB Output is correct
10 Correct 249 ms 14404 KB Output is correct
11 Correct 554 ms 36352 KB Output is correct
12 Correct 326 ms 21448 KB Output is correct
13 Correct 420 ms 29636 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 2049 ms 17468 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 4416 KB Output is correct
2 Correct 462 ms 29288 KB Output is correct
3 Correct 382 ms 23144 KB Output is correct
4 Correct 523 ms 29060 KB Output is correct
5 Correct 435 ms 27204 KB Output is correct
6 Correct 592 ms 35600 KB Output is correct
7 Correct 704 ms 38876 KB Output is correct
8 Correct 624 ms 37256 KB Output is correct
9 Correct 533 ms 34468 KB Output is correct
10 Correct 249 ms 14404 KB Output is correct
11 Correct 554 ms 36352 KB Output is correct
12 Correct 326 ms 21448 KB Output is correct
13 Correct 420 ms 29636 KB Output is correct
14 Execution timed out 2049 ms 17468 KB Time limit exceeded
15 Halted 0 ms 0 KB -