Submission #1355165

#TimeUsernameProblemLanguageResultExecution timeMemory
1355165bakhtiyarnCopy and Paste 3 (JOI22_copypaste3)C++20
62 / 100
2236 ms49832 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

const int N = 2500+5;
const int mod = 1e9+7;
int p = 59;
int dp[N][N];
int pre[N];
int n, A, B, C; 
string s;

int powmod(int x, int y){
    if(!y) return 1;
    int res = powmod(x, y/2);
    if(y%2) return res * res % mod * x % mod;
    return res * res % mod;
}

int get_hash(int l, int r){
    return ((pre[r] - pre[l-1])%mod+mod)%mod * powmod(powmod(p, l-1), mod-2)%mod;
}

// for(int i=1; i<=n; i++)
void solve(){
    cin >> n >> s >> A >> B >> C;
    s = '%' + s;
    for(int i=1; i<=n; i++) pre[i] = (pre[i-1]+(s[i]-'a'+1)*powmod(p, i)%mod)%mod;

    for(int sz=0; sz<=n+1; sz++) for(int i=0; i<=n+1; i++) dp[sz][i] = 1e18;

    for(int sz=1; sz<=n; sz++) dp[sz][sz] = A;
    
    for(int sz=1; sz<=n; sz++){
        vector<int> nxt(n+1, -1);
        map<int, vector<int>> mp;
        for(int i=1; i+sz-1<=n; i++) {
            mp[get_hash(i, i+sz-1)].push_back(i);
        }
        for(int i=1; i+sz-1<=n; i++) {
            int hash = get_hash(i, i+sz-1);
            auto it = lower_bound(mp[hash].begin(), mp[hash].end(), i+sz);
            if(it == mp[hash].end()) nxt[i] = -1;
            else nxt[i] = *it;
        }


        for(int l=1; l+sz-1<=n; l++){
            int r = l + sz - 1;

            dp[l][r] = min(dp[l][r], min(dp[l][r-1], dp[l+1][r]) + A);

            if(nxt[l] == -1) continue;

            int you = dp[l][r] + B + C;
            int p = nxt[l];
            int end = r;

            while(p != -1 and end <= n){
                you += (p - end - 1)*A + C;
                end = p + sz - 1;
                dp[l][end] = min(dp[l][end], you);
                p = nxt[p];
            }
        }
    }
    cout << dp[1][n];
}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    solve();
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...