Submission #1226255

#TimeUsernameProblemLanguageResultExecution timeMemory
1226255minhpkCopy and Paste 3 (JOI22_copypaste3)C++20
100 / 100
399 ms176644 KiB
#include <bits/stdc++.h> #define int long long using namespace std; int a; string s; int lcp[3001][3001]; int nxt[3001][3001]; int dp[3001][3001]; int A,B,C; int bruh=1e16; signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> a; cin >> s; s='#'+s; cin >> A >> B >> C; for (int i=a;i>=1;i--){ for (int j=a;j>=1;j--){ lcp[i][j]=(s[i]==s[j])*(lcp[i+1][j+1]+1); } } for (int i=1;i<=a;i++){ for (int j=1;j<=a;j++){ nxt[i][j]=a+1; dp[i][j]=bruh; } } for (int i=1;i<=a;i++){ dp[i][i]=A; for (int j=a;j>i;j--){ int len=min(lcp[i][j],j-i); if (len){ nxt[i][len]=j; } nxt[i][j-i]=min(nxt[i][j-i],nxt[i][j-i+1]); } } for (int len=1;len<=a;len++){ for (int i=1;i+len-1<=a;i++){ int j=i+len-1; dp[i][j]=min({dp[i][j],dp[i+1][j]+A,dp[i][j-1]+A}); int p=nxt[i][len]; int cnt=2; while (p<=a){ dp[i][p+len-1]=min(dp[i][p+len-1],dp[i][j]+B+C*cnt +(p+len-1-i+1-len*cnt)*A); p=nxt[p][len]; cnt++; } } } cout << dp[1][a] << "\n"; return 0; }
#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...