제출 #1289496

#제출 시각아이디문제언어결과실행 시간메모리
1289496IcelastCopy and Paste 3 (JOI22_copypaste3)C++20
100 / 100
287 ms74160 KiB
#include <iostream> #include <bits/stdc++.h> #define ll long long using namespace std; const ll maxn = 2*1e5+5, INF = 4e18+9; vector<int> z_function(string s) { int n = s.size(); vector<int> z(n); int l = 0, r = 0; for(int i = 1; i < n; i++) { if(i < r) { z[i] = min(r - i, z[i - l]); } while(i + z[i] < n && s[z[i]] == s[i + z[i]]) { z[i]++; } if(i + z[i] > r) { l = i; r = i + z[i]; } } return z; } void solve(){ int n; cin >> n; string s; cin >> s; s = ' ' + s; ll A, B, C; cin >> A >> B >> C; auto chmin = [&](ll &a, ll b) -> void{ a = min(a, b); }; vector<vector<ll>> f(n+2, vector<ll>(n+2, INF)); for(int i = 1; i <= n+1; i++){ f[i][i-1] = 0; } vector<vector<int>> link(n+1, vector<int>(n+1)); for(int l = n; l >= 1; l--){ vector<int> z(n+1, 0); vector<int> t = z_function(s.substr(l, n-l+1)); for(int i = l; i <= n; i++){ z[i] = t[i-l]; } int j = l; for(int len = 1; len <= n-l+1; len++){ chmin(f[l][l+len-1], f[l+1][l+len-1] + A); chmin(f[l][l+len-1], f[l][l+len-1-1] + A); j = max(j, l+len); while(j <= n && z[j] < len){ j++; } link[l][len] = j; int r = link[l][len]; int cnt = 1; while(r <= n){ cnt++; chmin(f[l][r+len-1], f[l][l+len-1] + B + C * cnt + A * ((r+len-1 - l + 1) - (len*cnt))); r = link[r][len]; } } } cout << f[1][n]; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); solve(); }
#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...