Submission #1075587

#TimeUsernameProblemLanguageResultExecution timeMemory
1075587vjudge1Copy and Paste 3 (JOI22_copypaste3)C++17
100 / 100
306 ms74320 KiB
/*
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("avx2,fma,bmi,bmi2,sse4.2,popcnt,lzcnt")
*/

#include <bits/stdc++.h>
#define taskname ""
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define i64 long long
#define isz(x) (int)x.size()
using namespace std;

const i64 oo = 1e18;

vector<int> z_function(string s) {
    int n = isz(s);
    vector<int> z(n);
    int l = 0, r = 0;
    for (int i = 1; i < n; i++) {
        if (i < r) {
            z[i] = min(r - i, z[i - l]);
        }
        while (i + z[i] < n and s[z[i]] == s[i + z[i]]) {
            z[i]++;
        }
        if (i + z[i] > r) {
            l = i;
            r = i + z[i];
        }
    }
    return z;
}

void solve() {
    int n;
    cin >> n;

    string s;
    cin >> s;

    i64 a, b, c;
    cin >> a >> b >> c;

    vector<vector<int>> nxt(n, vector<int>(n + 1));
    for (int i = 0; i < n; ++i) {
        auto vec = z_function(s.substr(i, n - i));
        int mx = 0;
        for (int j = i + 1; j <= n; ++j) {
            int nmx = min(j - i, vec[j - i]);
            while (mx < nmx) {
                ++mx;
                nxt[i][i + mx] = j;
            }
        }
        while (mx < n - i) {
            ++mx;
            nxt[i][i + mx] = n;
        }
    }
    
    vector<vector<i64>> dp(n, vector<i64>(n + 1, oo));
    for (int i = 0; i < n; ++i) dp[i][i + 1] = a + b;
    for (int len = 1; len < n; ++len) {
        for (int l = 0; l <= n - len; ++l) {
            int r = l + len;
            if (l - 1 >= 0) dp[l - 1][r] = min(dp[l - 1][r], dp[l][r] + a);
            if (r + 1 <= n) dp[l][r + 1] = min(dp[l][r + 1], dp[l][r] + a);

            int cr = nxt[l][r] + len, cnt = 2;
            while (cr <= n) {
                dp[l][cr] = min(dp[l][cr], dp[l][r] + cnt * c + (cr - l - len * cnt) * a + b);
                cr = nxt[cr - len][cr] + len, ++cnt;
            }
        }
    }
    cout << dp[0][n] - b << endl;
}

signed main() {
    if (fopen("in.txt", "r")) 
    {
        freopen("in.txt", "r", stdin);
        freopen("out.txt", "w", stdout);
    }
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1; //cin >> t;
    while(t--) solve();

}

Compilation message (stderr)

copypaste3.cpp: In function 'int main()':
copypaste3.cpp:83:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   83 |         freopen("in.txt", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
copypaste3.cpp:84:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   84 |         freopen("out.txt", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...