제출 #796312

#제출 시각아이디문제언어결과실행 시간메모리
796312vjudge1Copy and Paste 3 (JOI22_copypaste3)C++17
0 / 100
1 ms456 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...