Submission #922686

#TimeUsernameProblemLanguageResultExecution timeMemory
922686huutuanCopy and Paste 3 (JOI22_copypaste3)C++14
57 / 100
3037 ms72272 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define isz(x) ((int)x.size()) #define sumof(x) accumulate(all(x), 0ll) pair<int, int> mod={(int)1e9+7, (int)1e9+9}; const int base=311; struct Hash{ pair<int, int> value; Hash (int x=0){ value={x%mod.first, x%mod.second}; } Hash (int x, int y){ value={x, y}; } Hash operator-(){ return Hash((mod.first-value.first)%mod.first, (mod.second-value.second)%mod.second); } Hash operator+(Hash b){ return Hash((value.first+b.value.first)%mod.first, (value.second+b.value.second)%mod.second); } Hash operator*(Hash b){ return Hash(value.first*b.value.first%mod.first, value.second*b.value.second%mod.second); } bool operator<(Hash b) const { return value<b.value; } bool operator==(Hash b) const { return value==b.value; } }; const int N=2510; int f[N][N], add, cut, paste, n; int g[N][N]; Hash pf[N]; Hash pw[N]; string s; Hash get(int l, int r){ return pf[r]+(-pf[l-1])*pw[r-l+1]; } void precalc(){ pw[0]=1; for (int i=1; i<=n; ++i){ pw[i]=pw[i-1]*base; } for (int i=1; i<=n; ++i){ pf[i]=pf[i-1]*base+s[i]; } for (int t=1; t<=n; ++t){ map<Hash, int> mp; for (int r=t; r<=n; ++r){ Hash h1=get(r-t+1, r); g[r][t]=mp.count(h1)?mp[h1]:-1; if (r-t+1>=t){ Hash h2=get(r-t+1-t+1, r-t+1); mp[h2]=r-t+1; } } } } int count(int l, int r, int t){ if (r-l+1<t) return 0; int pos=g[r][t]; return count(l, pos, t)+1; } int dp(int l, int r){ if (l>r) return 0; if (f[l][r]!=-1) return f[l][r]; int res=dp(l, r-1)+add; for (int t=l; t<=r; ++t){ int cnt=count(l, r, r-t+1); if (cnt!=1) res=min(res, dp(t, r)+cut+cnt*paste+add*(r-l+1-cnt*(r-t+1))); } return f[l][r]=res; } void solve(){ memset(f, -1, sizeof f); cin >> n >> s; s=" "+s; precalc(); cin >> add >> cut >> paste; cout << dp(1, n); } int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int ntests=1; // cin >> ntests; for (int i=1; i<=ntests; ++i) solve(); 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...