Submission #1059768

#TimeUsernameProblemLanguageResultExecution timeMemory
1059768vjudge1Copy and Paste 3 (JOI22_copypaste3)C++17
1 / 100
1 ms604 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define int ll const int N = 2500 + 2; struct H{ int p,mod; vector<ll> h,inv; ll binpow(ll a,ll b) { ll ret = 1,k = a; while(b) { if(b & 1) { ret *= k; ret %= mod; } k *= k; k%=mod; b /= 2; } return ret; } void init(string s) { int n = (int)s.size(); h.resize((int)s.size()); inv.resize((int)s.size()); ll x = 1; for(int i = 0;i < n;i++) { h[i] = x * 1ll * (s[i] - 'a' + 1)%mod; if(i) h[i] += h[i - 1]; if(h[i] >= mod) h[i] -= mod; inv[i] = binpow(x,mod-2); x = x * 1ll * p%mod; } } int get(int l,int r) { ll val = h[r]; if(l) { val -= h[l - 1]; } if(val < 0) val += mod; val = val * inv[l]%mod; return val; } }xx,yy; string s; ll a,b,c; int n; ll dp[N][N]; int nx[N][N]; map<pair<int,int>,vector<pair<int,int>>> f; void test() { cin >> n >> s >> a >> b >> c; yy.p = 37;yy.mod = 998244353;yy.init(s); xx.p = 167;xx.mod = (int)1e9 + 7;xx.init(s); for(int i = 0;i < n;i++) { for(int j = i;j < n;j++) { f[{xx.get(i,j),yy.get(i,j)}].push_back({i,j}); } } for(auto [t,k]:f) { int it = (int)k.size() - 1; for(int j = (int)k.size() - 1;j >= 0;j--) { while(it >= 0 && k[it].first > k[j].second) { it--; } if(it == (int)k.size() - 1) { nx[k[j].first][k[j].second] = -1; } else { nx[k[j].first][k[j].second] = k[it + 1].first; } } } for(int l = n - 1;l >= 0;l--) { dp[l][l] = a; for(int r = l + 1;r < n;r++) { dp[l][r] = min(dp[l + 1][r],dp[l][r - 1]) + a; int len = (r - l + 1) / 2; int mx = -1; for(;len >= 1;len--) { if(xx.get(l,l + len - 1) != xx.get(r - len + 1,r)) continue; if(yy.get(l,l + len - 1) != yy.get(r - len + 1,r)) continue; int occ = 0; int L = l,R = l + len - 1; while(true) { occ++; L = nx[L][R]; R = L + len - 1; if(L == -1 || R > r) { break; } } if(mx >= occ) break; mx = occ; int sz = (r - l + 1); dp[l][r] = min(dp[l][r],dp[l][l + len - 1] + (sz - len * 1ll * occ) * 1ll * a + (occ - 1) * c + b + c); } // cout << l << ' ' << r << ' ' << dp[l][r] << '\n'; } } cout << dp[0][n-1] << '\n'; } signed main() { ios_base::sync_with_stdio(false);cin.tie(0); int t = 1; // cin >> t; while(t--) { test(); } }
#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...