답안 #433245

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
433245 2021-06-19T10:53:11 Z parsabahrami Dabbeh (INOI20_dabbeh) C++17
25 / 100
2000 ms 430660 KB
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,fma,tune=native")

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};
struct pair_hash {
    template <class T1, class T2>
    size_t operator () (const std::pair<T1,T2> &p) const {
        auto h1 = std::hash<T1>{}(p.first);
        auto h2 = std::hash<T2>{}(p.second);
        return h1 ^ h2;  
    }
};

int pw[2][N], H[2][N], dp[19][N], rmq[19][19][N], lg[N], n, m, q, base[] = {37, 31}; 
char S[N * 2]; 
unordered_map<pii, int, pair_hash> mp;
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 < 19; 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 < 19; 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(18); q; q--) {
        int l, r; scanf("%d%d", &l, &r); l++;
        int ret = 0, p = l;
        for (int i = 18; ~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:60:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   60 |     scanf("%d%d", &n, &q);
      |     ~~~~~^~~~~~~~~~~~~~~~
Main.cpp:62:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   62 |         scanf("%s", S);
      |         ~~~~~^~~~~~~~~
Main.cpp:70:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   70 |     scanf("%s", S + 1); m = strlen(S + 1);
      |     ~~~~~^~~~~~~~~~~~~
Main.cpp:92:24: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   92 |         int l, r; scanf("%d%d", &l, &r); l++;
      |                   ~~~~~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 4388 KB Output is correct
2 Correct 334 ms 28960 KB Output is correct
3 Correct 244 ms 21484 KB Output is correct
4 Correct 375 ms 28804 KB Output is correct
5 Correct 282 ms 24484 KB Output is correct
6 Correct 396 ms 31740 KB Output is correct
7 Correct 391 ms 34272 KB Output is correct
8 Correct 393 ms 32996 KB Output is correct
9 Correct 365 ms 30876 KB Output is correct
10 Correct 163 ms 12072 KB Output is correct
11 Correct 411 ms 32416 KB Output is correct
12 Correct 193 ms 18536 KB Output is correct
13 Correct 266 ms 24520 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1448 ms 423520 KB Output is correct
2 Correct 1878 ms 430512 KB Output is correct
3 Correct 1416 ms 425892 KB Output is correct
4 Correct 947 ms 418704 KB Output is correct
5 Correct 952 ms 418560 KB Output is correct
6 Correct 1882 ms 430660 KB Output is correct
7 Execution timed out 2054 ms 404544 KB Time limit exceeded
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 4388 KB Output is correct
2 Correct 334 ms 28960 KB Output is correct
3 Correct 244 ms 21484 KB Output is correct
4 Correct 375 ms 28804 KB Output is correct
5 Correct 282 ms 24484 KB Output is correct
6 Correct 396 ms 31740 KB Output is correct
7 Correct 391 ms 34272 KB Output is correct
8 Correct 393 ms 32996 KB Output is correct
9 Correct 365 ms 30876 KB Output is correct
10 Correct 163 ms 12072 KB Output is correct
11 Correct 411 ms 32416 KB Output is correct
12 Correct 193 ms 18536 KB Output is correct
13 Correct 266 ms 24520 KB Output is correct
14 Correct 1448 ms 423520 KB Output is correct
15 Correct 1878 ms 430512 KB Output is correct
16 Correct 1416 ms 425892 KB Output is correct
17 Correct 947 ms 418704 KB Output is correct
18 Correct 952 ms 418560 KB Output is correct
19 Correct 1882 ms 430660 KB Output is correct
20 Execution timed out 2054 ms 404544 KB Time limit exceeded
21 Halted 0 ms 0 KB -