이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#define N 2510
#define INF 1000000000000000
using namespace std;
using ll = long long;
int n;
ll A, B, C;
string s;
ll dp[N][N];
int nxt[N][N];
vector<int> Z(string s) {
int n = (int)s.size();
vector<int> z(n);
for(int i = 1, l = 0, r = 1; i < n; i++) {
if(i < r) z[i] = min(z[i - l], r - i);
while(i + z[i] < n && s[i + z[i]] == s[z[i]])
z[i]++;
if(i + z[i] > r) l = i, r = i + z[i];
}
return z;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin >> n;
cin >> s;
for(int i = n - 1; i >= 0; i--) {
vector<int> z = Z(s.substr(i, n - i));
int lb = i;
for(int j = 0; j < n - i; j++) {
while(lb < n && (lb - i <= j || z[lb - i] <= j)) lb++;
nxt[i][i + j] = lb;
}
}
cin >> A >> B >> C;
for(int i = 0; i < n; i++) {
dp[i][i] = A;
for(int j = i + 1; j < n; j++)
dp[i][j] = INF;
}
for(int l = n - 1; l >= 0; l--) {
for(int r = l; r < n; r++) {
dp[l][r + 1] = min(dp[l][r + 1], dp[l][r] + A);
if(l) dp[l - 1][r] = min(dp[l - 1][r], dp[l][r] + A);
int len = r - l, h = l, cnt = 1;
while(nxt[h][h + len] != n) {
h = nxt[h][h + len];
cnt++;
dp[l][h + len] = min(dp[l][h + len], dp[l][r] + B + C * cnt + (h + len - l + 1 - (len + 1) * cnt) * A);
}
}
}
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... |