Submission #1178519

#TimeUsernameProblemLanguageResultExecution timeMemory
1178519ace5Copy and Paste 3 (JOI22_copypaste3)C++20
100 / 100
1706 ms54192 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 2505; typedef long long ll; int cl[maxn][maxn],zf[maxn],ans[maxn]; ll dp[maxn][maxn]; int main() { ios_base::sync_with_stdio(false); cin.tie(0); ll n,a,b,c; string s; cin >> n >> s >> a >> b >> c; for(int len = 1;len <= n+1;++len) for(int l = 0;l+len <= n+1;++l) cl[len][l] = n+1; for(int i = n-1;i >= 0;--i) { zf[i] = 0; int l = i,r = i; ans[1] = n+1; for(int j = i+1;j < n;++j) { ans[j-i+1] = n+1; zf[j] = 0; if(j <= r) zf[j] = min(r-j+1,zf[j-l+i]+j); while(j+zf[j] < n && s[j+zf[j]] == s[i+zf[j]]) zf[j]++; ans[min(zf[j],(j-i))] = min(ans[min(zf[j],(j-i))],j); } for(int len = n-i;len >= 1;--len) cl[len][i] = min(ans[len],cl[len+1][i]); } for(int l = n-1;l >= 0;--l) { vector<ll> mn(n,0); ll te = 0; for(int r = l;r < n;++r) { te = min(te,mn[r]); dp[l][r] = (l==r ? a : min({dp[l+1][r]+a,dp[l][r-1]+a,te + a * (r-l+1)})); int len = r-l+1,cpos = l; ll cmin = dp[l][r] + b - a * len + c; while(cpos != n+1) { mn[cpos+len-1] = min(mn[cpos+len-1],cmin); cmin += c - a*len; cpos = cl[len][cpos]; } } } cout << dp[0][n-1] << "\n"; }
#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...