#include <bits/stdc++.h>
#define int long long
using namespace std;
int a;
string s;
int lcp[3001][3001];
int nxt[3001][3001];
int dp[3001][3001];
int A,B,C;
int bruh=1e16;
signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> a;
    cin >> s;
    s='#'+s;
    cin >> A >> B >> C;
    for (int i=a;i>=1;i--){
         for (int j=a;j>=1;j--){
              lcp[i][j]=(s[i]==s[j])*(lcp[i+1][j+1]+1);
         }
    }
    for (int i=1;i<=a;i++){
         for (int j=1;j<=a;j++){
             nxt[i][j]=a+1;
             dp[i][j]=bruh;
         }
    }
    for (int i=1;i<=a;i++){
         dp[i][i]=A;
         for (int j=a;j>i;j--){
              int len=min(lcp[i][j],j-i);
              if (len){
                  nxt[i][len]=j;
              }
              nxt[i][j-i]=min(nxt[i][j-i],nxt[i][j-i+1]);
         }
    }
    for (int len=1;len<=a;len++){
         for (int i=1;i+len-1<=a;i++){
              int j=i+len-1;
              dp[i][j]=min({dp[i][j],dp[i+1][j]+A,dp[i][j-1]+A});
              int p=nxt[i][len];
              int cnt=2;
              while (p<=a){
                  dp[i][p+len-1]=min(dp[i][p+len-1],dp[i][j]+B+C*cnt +(p+len-1-i+1-len*cnt)*A);
                  p=nxt[p][len];
                  cnt++;
              }
         }
    }
    cout << dp[1][a] << "\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... |