#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 2505;
const int MAXND = 4000000;
vector<pair<char, int>> adj[MAXND];
vector<int> stn[MAXND];
vector<tuple<int, int, int>> seqv[MAXN][MAXN];
ll A, B, C, memo[MAXN][MAXN];
void dfs(int x, int d){
int sz = stn[x].size();
vector<int> nxt(sz);
for (int i = 0; i < sz; i++) nxt[i] = lower_bound(stn[x].begin(), stn[x].end(), stn[x][i] + d) - stn[x].begin();
for (int i = 0; i < sz; i++){
int l = stn[x][i];
for (int curr = nxt[i], occ = 2; curr < sz; curr = nxt[curr], occ++) seqv[l][stn[x][curr] + d - 1].push_back({l, l + d - 1, occ});
}
for (auto [nc, nn] : adj[x]) dfs(nn, d + 1);
}
ll dp(int l, int r){
if (l == r) return A;
if (memo[l][r] != -1) return memo[l][r];
ll ans = min(dp(l + 1, r), dp(l, r - 1)) + A;
for (auto [ls, rs, occ] : seqv[l][r]){
int len = rs - ls + 1, rem = r - l + 1 - occ * len;
ans = min(ans, dp(ls, rs) + B + occ * C + rem * A);
}
return memo[l][r] = ans;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int nums; cin >> nums;
string str; cin >> str;
int ind = 0;
for (int i = 0; i < nums; i++){
int x = 0;
for (int j = i; j < nums; j++){
bool flag = 0;
for (auto [nc, nn] : adj[x])
if (nc == str[j]){
x = nn; flag = 1;
}
if (!flag){
adj[x].push_back({str[j], ++ind});
x = ind;
}
stn[x].push_back(i);
}
}
dfs(0, 0);
cin >> A >> B >> C;
memset(memo, -1, sizeof(memo));
cout << dp(0, nums - 1);
}
# | 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... |