이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int INF = 1e18;
map<string, int> M;
string S;
int D[2505][2505];
signed main() {
cin.sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int N;
cin >> N;
cin >> S;
int A, B, C;
cin >> A >> B >> C;
int i, j;
for(i=0;i<=N;i++) {
for(j=0;j<=N;j++) D[i][j] = INF;
}
M[""] = 0;
int L = B / A;
for(int len = 1; len <= N; len++) {
for(i=0;i+len<=N;i++) {
//( Copy ) AAA
if(len==1) {
D[i][i+len] = A;
string o = "";
o+=S[i];
M[o] = D[i][i+len];
continue;
}
string s = "";
D[i][i+len] = len * A;
D[i][i+len] = min(D[i][i+len],min(D[i][i+len-1],D[i+1][i+len])+A);
for(j=1;j<=len;j++) {
s+=S[i+j-1];
if(j<=L) continue;
if(!M.count(s)) continue;
int cnt = i + j;
for(cnt = i+j; cnt < i + len&&S[cnt]==s[(cnt-(i+j))%j]; cnt++);
int sz = (cnt-i)/j;
int val = M[s];
D[i][i+len] = min(D[i][i+len],B + val + C * sz + A * (len - j * sz));
}
M[s] = D[i][i+len];
//cout << i << " to " << i + len << " : " << D[i][i+len] << '\n';
}
}
cout << D[0][N];
}
# | 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... |