제출 #587782

#제출 시각아이디문제언어결과실행 시간메모리
587782TekorCopy and Paste 3 (JOI22_copypaste3)C++17
57 / 100
1511 ms13284 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define pll pair <ll,ll> #define mp make_pair #define f first #define s second #define all(v) v.begin(),v.end() void boos() { ios_base :: sync_with_stdio(0); cin.tie(0); cout.tie(0); } const int N = 1e3 + 1; const ll p = 433,p1 = 383; const ll INF = (ll)1e9 + 7ll; ll binpow(ll a,ll b) { ll ans = 1,k = a; while(b) { if(b % 2)ans *= k; ans %= INF; k *= k; k %= INF; b /= 2ll; } return ans; } ll has[N],has1[N],st[N],st1[N]; ll dp[N][N]; ll cc[N][N]; pll calc(int l,int r) { ll tek = (has[r] - has[l - 1] + INF) % INF; tek = (tek * st[l]) % INF; ll tek1 = (has1[r] - has1[l - 1] + INF) % INF; tek1 = (tek1 * st1[l]) % INF; return mp(tek,tek1); } void solve() { int n; cin >> n; string s; cin >> s; ll a,b,c; cin >> a >> b >> c; s = "0" + s; ll tek = p,tek1 = p1; st[1] = binpow(tek,INF - 2); st1[1] = binpow(tek1,INF - 2); has[1] = (s[1] - 'a' + 1ll); has1[1] = has[1]; for(int i = 2;i <= n;i++) { ll val = (s[i] - 'a' + 1ll); has[i] = (has[i - 1] + (tek * val) % INF) % INF; has1[i] = (has1[i - 1] + (tek1 * val) % INF) % INF; tek = (tek * p) % INF; tek1 = (tek1 * p1) % INF; st[i] = binpow(tek,INF - 2); st1[i] = binpow(tek1,INF - 2); } for(int i = 1;i <= n;i++)dp[i][i] = a; // for(int sz = 2;sz <= n;sz++) { // for(int l = 1;l <= n - sz + 1;l++) { // int r = l + sz - 1; // dp[l][r] = dp[l][r - 1] + a; // for(int sz1 = 1;sz1 * 2 <= sz;sz1++) { // for(int h = l;h <= r;h++)cc[h] = 1; // for(int h = r - 2 * sz1 + 1;h >= l;h--) { // cc[h] = max(cc[h],cc[h + 1]); // if(calc(h,h + sz1 - 1) == calc(r - sz1 + 1,r)) { // //cout << h << " " << h + sz1 - 1 << " === " << r - sz1 + 1 << " " << r << endl; // cc[h] = max(cc[h],cc[h + sz1] + 1); // } // dp[l][r] = min(dp[l][r],cc[h] * c + b + a * (ll)(sz - cc[h] * sz1) + dp[r - sz1 + 1][r]); // } // } // } // } for(int r = 2;r <= n;r++) { for(int l = r - 1;l >= 1;l--) { dp[l][r] = dp[l][r - 1] + a; dp[l][r] = min(dp[l][r],dp[l + 1][r] + a); int sz = r -l + 1; for(int sz1 = 1;sz1 * 2 <= sz;sz1++) { cc[l][sz1] = cc[l + 1][sz1]; if(calc(l,l + sz1 - 1) == calc(r - sz1 + 1,r)) { if(cc[l + sz1][sz1] == 0)cc[l][sz1] = max(cc[l][sz1],2ll); else cc[l][sz1] = max(cc[l][sz1],cc[l + sz1][sz1] + 1); } dp[l][r] = min(dp[l][r],cc[l][sz1] * c + b + a * (ll)(sz - cc[l][sz1] * sz1) + dp[r - sz1 + 1][r]); } } } cout << dp[1][n]; } int main() { boos(); 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...