제출 #796756

#제출 시각아이디문제언어결과실행 시간메모리
796756vjudge1Copy and Paste 3 (JOI22_copypaste3)C++17
100 / 100
334 ms54176 KiB
#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 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...