// https://codeforces.com/blog/entry/101003?#comment-897398
// https://oj.uz/submission/1096892
#include <bits/stdc++.h>
using namespace std;
const int N = 2505;
const long long oo = 1e18;
template<class T> 
	void mini(T &X, T Y) {
		if (X > Y) X = Y;
	}
int n;
long long A, B, C;
string s;
int LCP[N][N], nxt[N][N];
long long dp[N][N];
signed main(void) {
    ios::sync_with_stdio(false); cin.tie(nullptr);
    
    cin >> n >> s;
    s = ' ' + s;
    cin >> A >> B >> C;
    
    for (int i = n; i; i--) {
    	for (int j = n; j; j--) {
    		LCP[i][j] = (s[i] == s[j]) * (LCP[i + 1][j + 1] + 1);
    		nxt[i][j] = n + 1;
    		dp[i][j] = oo;
    	}
    }
    for (int i = 1; i <= n; i++) {
    	dp[i][i] = A;
    	for (int j = n; j > i; j--) {
    		int len = min(LCP[i][j], j - i);
    		if (len) {
    			mini(nxt[i][len], j);
    		}
    	}
    	for (int len = n - i; len; len--) {
    		mini(nxt[i][len], nxt[i][len + 1]);
    	}
    }
    // finding out how to compute nxt is quite hard...
    for (int len = 1; len <= n; len++) {
    	for (int l = 1; l <= n - len + 1; l++) {
    		int r = l + len - 1;
    		mini(dp[l][r], min(dp[l][r - 1], dp[l + 1][r]) + A);
    		int p = nxt[l][len], num = 2;
    		while (p <= n) {
    			mini(dp[l][p + len - 1], dp[l][r] + B + num * C + (p + len - l - num * len) * A);
    			p = nxt[p][len];
    			num++;
    		}
    	}
    }
    cout << dp[1][n];
    
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |