답안 #951787

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
951787 2024-03-22T16:01:42 Z EJIC_B_KEDAX Copy and Paste 3 (JOI22_copypaste3) C++17
57 / 100
3000 ms 350596 KB
#ifdef LOCAL
    #define _GLIBCXX_DEBUG
#endif
#include <bits/stdc++.h>

#ifndef LOCAL
    // #pragma GCC optimize("O3")
    // #pragma GCC optimize("Ofast")
    // #pragma GCC optimize("unroll-loops")
    // #pragma GCC target("avx,avx2,bmi,bmi2,popcnt,lzcnt")
#endif
using namespace std;
using ll = long long;
using ld = long double;
#define x first
#define y second
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()

mt19937_64 mt(time(0));

void solve();
void init();

int32_t main() {
#ifndef LOCAL
    cin.tie(nullptr)->sync_with_stdio(false);
#endif
    cout << fixed << setprecision(30);
    init();
    int t = 1;
    // cin >> t;
    while (t--) {
        solve();
    }
}

const int N = 2525, mod = 1000000321, p = 31;
ll dp[N][N];
int to[N][N], nw[N][N], hsh[N], pdeg[N], pinv[N];
vector<pair<int, int>> upd[N];

int add(int a, int b) {
    return a + b >= mod ? a + b - mod : a + b;
}

int sub(int a, int b) {
    return a >= b ? a - b : a - b + mod;
}

int mul(int a, int b) {
    return 1ll * a * b % mod;
}

int bin_pow(int a, int x) {
    int res = 1;
    while (x) {
        if (x & 1) {
            res = mul(res, a);
        }
        a = mul(a, a);
        x >>= 1;
    }
    return res;
}

int inv(int a) {
    return bin_pow(a, mod - 2);
}

void init() {
    pdeg[0] = 1;
    pdeg[1] = p;
    pinv[0] = 1;
    pinv[1] = inv(p);
    for (int i = 2; i < N; i++) {
        pdeg[i] = mul(pdeg[i - 1], p);
        pinv[i] = mul(pinv[i - 1], pinv[1]);
    }
}

int get_hash(int l, int r) {
    return mul(sub(hsh[r + 1], hsh[l]), pinv[l]);
}

struct segment_tree {
    vector<ll> st;
    int size;
    segment_tree(int sz = N) {
        st.resize(2 * sz, 0);
        size = sz;
    }
    void add(int i, ll v) {
        i += size;
        st[i] += v;
        i >>= 1;
        while (i) {
            st[i] = min(st[2 * i], st[2 * i + 1]);
            i >>= 1;
        }
    }
    ll get_min(int l, int r) {
        l += size;
        r += size;
        ll res = INT64_MAX;
        while (l <= r) {
            if (l & 1) {
                res = min(res, st[l++]);
            }
            if (~r & 1) {
                res = min(res, st[r--]);
            }
            l >>= 1;
            r >>= 1;
        }
        return res;
    }
};

segment_tree st[N];

void solve() {
    int n;
    cin >> n;
    string s;
    cin >> s;
    int a, b, c;
    cin >> a >> b >> c;
    hsh[0] = 0;
    for (int i = 0; i < n; i++) {
        hsh[i + 1] = add(hsh[i], mul(s[i] - 'a' + 1, pdeg[i]));
        upd[i].reserve(10 * N);
    }
    for (int l = 0; l < n; l++) {
        unordered_map<int, int> mp;
        for (int i = 0; i < n - l; i++) {
            int j = i + l;
            int nw = get_hash(i, j);
            if (mp.find(nw) == mp.end()) {
                to[i][j] = -1;
            } else {
                to[i][j] = mp[nw];
            }
            if (i >= l) {
                mp[get_hash(i - l, i)] = i - l;
            }
        }
    }
    for (int i = 0; i < n; i++) {
        dp[i][i] = a;
        // save[i][i] = b + c;
        st[i].add(i, b + c);
        nw[i][i] = to[i][i];
        if (to[i][i] != -1) {
            upd[i - to[i][i]].emplace_back(i, i);
        }
    }
    for (int l = 1; l < n; l++) {
        for (auto [i, j] : upd[l]) {
            int nxt = to[nw[i][j]][nw[i][j] + j - i];
            nw[i][j] = nxt;
            if (nxt >= 0) {
                upd[j - nxt].emplace_back(i, j);
            }
            // save[j][i] += b - 1ll * (j - i + 1) * a;
            st[j].add(i, c - 1ll * (j - i + 1) * a);
        }
        for (int i = 0; i < n - l; i++) {
            int j = i + l;
            dp[i][j] = min(1ll * (j - i + 1) * a + min(0ll, st[j].get_min(i + 1, j)), dp[i][j - 1] + a);
            st[j].add(i, dp[i][j] + b + c - 1ll * (j - i + 1) * a);
            nw[i][j] = to[i][j];
            if (nw[i][j] != -1) {
                upd[j - nw[i][j]].emplace_back(i, j);
            }
        }
    }
    // cout << to[3][3] << '\n';
    // for (int i = 0; i < n; i++) {
    //     for (int j = i; j < n; j++) {
    //         cout << dp[i][j] << ' ';
    //     }
    //     cout << '\n';
    // }
    cout << dp[0][n - 1] << '\n';
}
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 106572 KB Output is correct
2 Correct 37 ms 106544 KB Output is correct
3 Correct 39 ms 106584 KB Output is correct
4 Correct 46 ms 106576 KB Output is correct
5 Correct 40 ms 106576 KB Output is correct
6 Correct 37 ms 106576 KB Output is correct
7 Correct 38 ms 106576 KB Output is correct
8 Correct 38 ms 106580 KB Output is correct
9 Correct 38 ms 106588 KB Output is correct
10 Correct 37 ms 106580 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 106576 KB Output is correct
2 Correct 38 ms 106580 KB Output is correct
3 Correct 1396 ms 259448 KB Output is correct
4 Correct 1470 ms 282728 KB Output is correct
5 Correct 1879 ms 306732 KB Output is correct
6 Correct 2346 ms 336136 KB Output is correct
7 Execution timed out 3045 ms 350596 KB Time limit exceeded
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 106572 KB Output is correct
2 Correct 37 ms 106544 KB Output is correct
3 Correct 39 ms 106584 KB Output is correct
4 Correct 46 ms 106576 KB Output is correct
5 Correct 40 ms 106576 KB Output is correct
6 Correct 37 ms 106576 KB Output is correct
7 Correct 38 ms 106576 KB Output is correct
8 Correct 38 ms 106580 KB Output is correct
9 Correct 38 ms 106588 KB Output is correct
10 Correct 37 ms 106580 KB Output is correct
11 Correct 40 ms 106580 KB Output is correct
12 Correct 48 ms 106576 KB Output is correct
13 Correct 39 ms 106492 KB Output is correct
14 Correct 38 ms 106544 KB Output is correct
15 Correct 37 ms 106580 KB Output is correct
16 Correct 38 ms 106496 KB Output is correct
17 Correct 38 ms 106576 KB Output is correct
18 Correct 37 ms 104536 KB Output is correct
19 Correct 40 ms 106580 KB Output is correct
20 Correct 38 ms 106564 KB Output is correct
21 Correct 38 ms 106580 KB Output is correct
22 Correct 39 ms 106580 KB Output is correct
23 Correct 38 ms 106712 KB Output is correct
24 Correct 38 ms 106580 KB Output is correct
25 Correct 37 ms 106568 KB Output is correct
26 Correct 37 ms 106580 KB Output is correct
27 Correct 37 ms 106616 KB Output is correct
28 Correct 38 ms 106664 KB Output is correct
29 Correct 39 ms 106828 KB Output is correct
30 Correct 39 ms 106580 KB Output is correct
31 Correct 38 ms 106584 KB Output is correct
32 Correct 37 ms 106580 KB Output is correct
33 Correct 38 ms 106532 KB Output is correct
34 Correct 37 ms 104500 KB Output is correct
35 Correct 40 ms 106580 KB Output is correct
36 Correct 37 ms 106580 KB Output is correct
37 Correct 37 ms 106576 KB Output is correct
38 Correct 38 ms 106628 KB Output is correct
39 Correct 37 ms 106580 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 106572 KB Output is correct
2 Correct 37 ms 106544 KB Output is correct
3 Correct 39 ms 106584 KB Output is correct
4 Correct 46 ms 106576 KB Output is correct
5 Correct 40 ms 106576 KB Output is correct
6 Correct 37 ms 106576 KB Output is correct
7 Correct 38 ms 106576 KB Output is correct
8 Correct 38 ms 106580 KB Output is correct
9 Correct 38 ms 106588 KB Output is correct
10 Correct 37 ms 106580 KB Output is correct
11 Correct 40 ms 106580 KB Output is correct
12 Correct 48 ms 106576 KB Output is correct
13 Correct 39 ms 106492 KB Output is correct
14 Correct 38 ms 106544 KB Output is correct
15 Correct 37 ms 106580 KB Output is correct
16 Correct 38 ms 106496 KB Output is correct
17 Correct 38 ms 106576 KB Output is correct
18 Correct 37 ms 104536 KB Output is correct
19 Correct 40 ms 106580 KB Output is correct
20 Correct 38 ms 106564 KB Output is correct
21 Correct 38 ms 106580 KB Output is correct
22 Correct 39 ms 106580 KB Output is correct
23 Correct 38 ms 106712 KB Output is correct
24 Correct 38 ms 106580 KB Output is correct
25 Correct 37 ms 106568 KB Output is correct
26 Correct 37 ms 106580 KB Output is correct
27 Correct 37 ms 106616 KB Output is correct
28 Correct 38 ms 106664 KB Output is correct
29 Correct 39 ms 106828 KB Output is correct
30 Correct 39 ms 106580 KB Output is correct
31 Correct 38 ms 106584 KB Output is correct
32 Correct 37 ms 106580 KB Output is correct
33 Correct 38 ms 106532 KB Output is correct
34 Correct 37 ms 104500 KB Output is correct
35 Correct 40 ms 106580 KB Output is correct
36 Correct 37 ms 106580 KB Output is correct
37 Correct 37 ms 106576 KB Output is correct
38 Correct 38 ms 106628 KB Output is correct
39 Correct 37 ms 106580 KB Output is correct
40 Correct 39 ms 108884 KB Output is correct
41 Correct 45 ms 113752 KB Output is correct
42 Correct 42 ms 113488 KB Output is correct
43 Correct 42 ms 113424 KB Output is correct
44 Correct 42 ms 113664 KB Output is correct
45 Correct 42 ms 113492 KB Output is correct
46 Correct 43 ms 113488 KB Output is correct
47 Correct 43 ms 113584 KB Output is correct
48 Correct 42 ms 113440 KB Output is correct
49 Correct 43 ms 113424 KB Output is correct
50 Correct 48 ms 113748 KB Output is correct
51 Correct 42 ms 113500 KB Output is correct
52 Correct 42 ms 113576 KB Output is correct
53 Correct 42 ms 113500 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 106572 KB Output is correct
2 Correct 37 ms 106544 KB Output is correct
3 Correct 39 ms 106584 KB Output is correct
4 Correct 46 ms 106576 KB Output is correct
5 Correct 40 ms 106576 KB Output is correct
6 Correct 37 ms 106576 KB Output is correct
7 Correct 38 ms 106576 KB Output is correct
8 Correct 38 ms 106580 KB Output is correct
9 Correct 38 ms 106588 KB Output is correct
10 Correct 37 ms 106580 KB Output is correct
11 Correct 40 ms 106580 KB Output is correct
12 Correct 48 ms 106576 KB Output is correct
13 Correct 39 ms 106492 KB Output is correct
14 Correct 38 ms 106544 KB Output is correct
15 Correct 37 ms 106580 KB Output is correct
16 Correct 38 ms 106496 KB Output is correct
17 Correct 38 ms 106576 KB Output is correct
18 Correct 37 ms 104536 KB Output is correct
19 Correct 40 ms 106580 KB Output is correct
20 Correct 38 ms 106564 KB Output is correct
21 Correct 38 ms 106580 KB Output is correct
22 Correct 39 ms 106580 KB Output is correct
23 Correct 38 ms 106712 KB Output is correct
24 Correct 38 ms 106580 KB Output is correct
25 Correct 37 ms 106568 KB Output is correct
26 Correct 37 ms 106580 KB Output is correct
27 Correct 37 ms 106616 KB Output is correct
28 Correct 38 ms 106664 KB Output is correct
29 Correct 39 ms 106828 KB Output is correct
30 Correct 39 ms 106580 KB Output is correct
31 Correct 38 ms 106584 KB Output is correct
32 Correct 37 ms 106580 KB Output is correct
33 Correct 38 ms 106532 KB Output is correct
34 Correct 37 ms 104500 KB Output is correct
35 Correct 40 ms 106580 KB Output is correct
36 Correct 37 ms 106580 KB Output is correct
37 Correct 37 ms 106576 KB Output is correct
38 Correct 38 ms 106628 KB Output is correct
39 Correct 37 ms 106580 KB Output is correct
40 Correct 39 ms 108884 KB Output is correct
41 Correct 45 ms 113752 KB Output is correct
42 Correct 42 ms 113488 KB Output is correct
43 Correct 42 ms 113424 KB Output is correct
44 Correct 42 ms 113664 KB Output is correct
45 Correct 42 ms 113492 KB Output is correct
46 Correct 43 ms 113488 KB Output is correct
47 Correct 43 ms 113584 KB Output is correct
48 Correct 42 ms 113440 KB Output is correct
49 Correct 43 ms 113424 KB Output is correct
50 Correct 48 ms 113748 KB Output is correct
51 Correct 42 ms 113500 KB Output is correct
52 Correct 42 ms 113576 KB Output is correct
53 Correct 42 ms 113500 KB Output is correct
54 Correct 59 ms 124820 KB Output is correct
55 Correct 332 ms 165484 KB Output is correct
56 Correct 160 ms 147536 KB Output is correct
57 Correct 140 ms 145748 KB Output is correct
58 Correct 130 ms 145744 KB Output is correct
59 Correct 126 ms 145884 KB Output is correct
60 Correct 122 ms 145748 KB Output is correct
61 Correct 138 ms 147028 KB Output is correct
62 Correct 294 ms 161572 KB Output is correct
63 Correct 128 ms 146260 KB Output is correct
64 Correct 154 ms 147280 KB Output is correct
65 Correct 208 ms 153680 KB Output is correct
66 Correct 201 ms 153700 KB Output is correct
67 Correct 129 ms 145748 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 106572 KB Output is correct
2 Correct 37 ms 106544 KB Output is correct
3 Correct 39 ms 106584 KB Output is correct
4 Correct 46 ms 106576 KB Output is correct
5 Correct 40 ms 106576 KB Output is correct
6 Correct 37 ms 106576 KB Output is correct
7 Correct 38 ms 106576 KB Output is correct
8 Correct 38 ms 106580 KB Output is correct
9 Correct 38 ms 106588 KB Output is correct
10 Correct 37 ms 106580 KB Output is correct
11 Correct 38 ms 106576 KB Output is correct
12 Correct 38 ms 106580 KB Output is correct
13 Correct 1396 ms 259448 KB Output is correct
14 Correct 1470 ms 282728 KB Output is correct
15 Correct 1879 ms 306732 KB Output is correct
16 Correct 2346 ms 336136 KB Output is correct
17 Execution timed out 3045 ms 350596 KB Time limit exceeded
18 Halted 0 ms 0 KB -