이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 2500;
const ll INF = 1e18;
ll dp[N][N];
pair<ll, ll> pr[N][N];
void modify(int i, int j, int l, int r, ll val) {
if(dp[i][j] <= val + dp[l][r]) return;
dp[i][j] = val + dp[l][r];
pr[i][j] = {l, r};
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int n;
cin >> n;
string s;
cin >> s;
ll A, B, C;
cin >> A >> B >> C;
for(int i = 0; i < n; i++) {
dp[i][i] = A;
}
for(int i = 0; i < n; i++) {
for(int j = i + 1; j < n; j++) {
dp[i][j] = INF;
pr[i][j] = {-1, -1};
}
}
for(int l = n - 1; l >= 0; l--) {
int pf[n] = {};
pf[l] = 0;
for(int i = l + 1; i < n; i++) {
pf[i] = pf[i - 1];
while(pf[i] && s[l + pf[i]] != s[i]) {
pf[i] = pf[l + pf[i] - 1];
}
if(s[l + pf[i]] == s[i]) pf[i]++;
}
for(int r = l; r < n; r++) {
if(l) modify(l - 1, r, l, r, A);
if(r < n - 1) modify(l, r + 1, l, r, A);
int len = r - l + 1;
int lb = r + len, k = 1;
while (lb < n) {
if(pf[lb] == len) {
k++;
modify(l, lb, l, r, B + C * k + (lb - l + 1 - len * k) * A);
lb += len;
} else lb++;
}
}
}
// for(int len = 1; len <= n; len++) {
// for(int l = 0; l <= n - len; l++) {
// cout << "(" << l << ' ' << l + len - 1 << ")" << dp[l][l + len - 1] << ' ' << pr[l][l + len - 1].first << ' ' << pr[l][l + len - 1].second << " . ";
// }
// cout << '\n';
// }
cout << dp[0][n - 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... |