Submission #703065

#TimeUsernameProblemLanguageResultExecution timeMemory
703065ajpianoCopy and Paste 3 (JOI22_copypaste3)C++17
100 / 100
769 ms49484 KiB
#include <bits/stdc++.h> using namespace std; const int tests = 0; #define f first #define s second typedef long long ll; typedef pair<ll,ll> pi; const ll mod1 = 1e9+7; const ll mod2 = 1e9+9; ll mult = 29; ll binexp1(ll num, ll p){ if(p == 0) return 1; if(p == 1) return num; ll ans = binexp1(num, p/2LL); ans = ans*ans%mod1; if(p&1) ans = ans*num%mod1; return ans; } ll binexp2(ll num, ll p){ if(p == 0) return 1; if(p == 1) return num; ll ans = binexp2(num, p/2LL); ans = ans*ans%mod2; if(p&1) ans = ans*num%mod2; return ans; } struct hashnum{ int sz = 0; ll num = 0; ll num1 = 0, num2 = 0; void add(char a){ num1 *= mult; num1 += (a-'a'+1); num1 %= mod1; num2 *= mult; num2 += (a-'a'+1); num2 %= mod2; sz++; num = num2*mod2 + num1; } void rem(char a){ num1 -= binexp1(mult, sz-1)*(ll)(a-'a'+1); num1 %= mod1; if(num1 < 0) num1 += mod1; num2 -= binexp2(mult, sz-1)*(ll)(a-'a'+1); num2 %= mod2; if(num2 < 0) num2 += mod2; sz--; num = num2*mod2 + num1; } }; void solve(){ int n; cin >> n; string s; cin >> s; ll a,b,c; cin >> a >> b >> c; ll dp[n+1][n+1]; //set up array for(int i = 1; i <= n; i++){ for(int j = 1; j+i-1 <= n; j++){ dp[i][j] = a*(ll)(i); } } //do dp for(int sz = 1; sz <= n; sz++){ hashnum curhash; vector<int> next(n+1, n+1); vector<ll> shash(n+1); map<ll, int> last; for(int i = 1; i <= sz; i++) curhash.add(s[i-1]); for(int l = 1; l+sz-1 <= n; l++){ if(sz != 1){ dp[sz][l] = min(dp[sz][l], a+min(dp[sz-1][l], dp[sz-1][l+1])); } //go through if(l > 1){ curhash.rem(s[l-2]); curhash.add(s[l+sz-2]); } //assign this substring hash shash[l] = curhash.num; //add the newly valid hash to the map if(l-sz > 0){ last[shash[l-sz]] = l-sz; } auto it = last.find(shash[l]); if(it != last.end()){ next[it->s] = l; } } for(int l = 1; l <= n; l++){ int r = next[l]; for(ll i = 2; r <= n; i++){ //cost = letter cost + pastes + cut + creation - extra letter count dp[r-l+sz][l] = min(dp[r-l+sz][l], a*(ll)(r-l - (i-1)*sz) + c*i + b + dp[sz][l]); r = next[r]; } } } cout << dp[n][1] << "\n"; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int t = 1; if(tests) cin >> t; while(t--) 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...