제출 #799874

#제출 시각아이디문제언어결과실행 시간메모리
799874phoenixCopy and Paste 3 (JOI22_copypaste3)C++17
100 / 100
344 ms54280 KiB
#include<bits/stdc++.h>
#define N 2510
#define INF 1000000000000000
using namespace std;
using ll = long long;

int n;
ll A, B, C;
string s;

ll dp[N][N];
int nxt[N][N];

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

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin >> n;
    cin >> s;
    for(int i = n - 1; i >= 0; i--) {
        vector<int> z = Z(s.substr(i, n - i));
        int lb = i;
        for(int j = 0; j < n - i; j++) {
            while(lb < n && (lb - i <= j || z[lb - i] <= j)) lb++;
            nxt[i][i + j] = lb;
        }
    }
    cin >> A >> B >> C;
    for(int i = 0; i < n; i++) {
        dp[i][i] = A;
        for(int j = i + 1; j < n; j++) 
            dp[i][j] = INF;
    }
    for(int l = n - 1; l >= 0; l--) {
        for(int r = l; r < n; r++) {
            dp[l][r + 1] = min(dp[l][r + 1], dp[l][r] + A);
            if(l) dp[l - 1][r] = min(dp[l - 1][r], dp[l][r] + A);
            int len = r - l, h = l, cnt = 1;
            while(nxt[h][h + len] != n) {
                h = nxt[h][h + len];
                cnt++;
                dp[l][h + len] = min(dp[l][h + len], dp[l][r] + B + C * cnt + (h + len - l + 1 - (len + 1) * cnt) * A);
            }
        }
    }
    cout << dp[0][n - 1];
}
#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...