Advertisement
welleyth

JOISCO 2022 2A

Mar 21st, 2022
1,101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.14 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4. using namespace __gnu_pbds;
  5. using namespace std;
  6. #define int long long
  7. #define pb push_back
  8. #define mp make_pair
  9.  
  10. #pragma GCC optimize("Ofast")
  11. #pragma GCC optimize("unroll-loops")
  12. //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,tune=native")
  13. //#pragma GCC target("avx,avx2")
  14.  
  15. constexpr int INF = (int)2e18;
  16. constexpr int N = (int)3000 + 11;
  17. constexpr int MAXN = (int)1e5 + 11;
  18. constexpr int md[2] = {(int)1e9+7,(int)1e9+9};
  19. constexpr int p[2] = {(int)101,103};
  20.  
  21. mt19937 rnd(time(nullptr));
  22.  
  23. int dp[N][N];
  24. int A,B,C;
  25. int h[2][N];
  26. int P[2][N];
  27.  
  28. int getHash(int l,int r,int t){
  29.     int h1 = h[t][r];
  30.     if(l)
  31.         h1 = (h1 - h[t][l-1]);
  32.     if(h1 < 0)
  33.         h1 += md[t];
  34.     return h1;
  35. }
  36.  
  37. bool compareOne(int l1,int r1,int l2,int r2,int t){
  38.     if(r2 < r1){
  39.         swap(l1,l2);
  40.         swap(r1,r2);
  41.     }
  42.     int h1 = getHash(l1,r1,t);
  43.     int h2 = getHash(l2,r2,t);
  44.     h1 = (h1 * P[t][r2-r1]) % md[t];
  45.     return h1 == h2;
  46. }
  47.  
  48. bool compare(int l1,int r1,int l2,int r2){
  49.     bool ok = true;
  50.     for(int i = 0; i < 1; i++)
  51.         ok &= compareOne(l1,r1,l2,r2,0);
  52.     return ok;
  53. }
  54.  
  55. void solve(){
  56.     int n;
  57.     cin >> n;
  58.  
  59.     P[0][0] = P[1][0] = 1;
  60.     for(int i = 1; i < N; i++){
  61.         for(int j = 0; j < 2; j++)
  62.             P[j][i] = (P[j][i-1] * p[j]) % md[j];
  63.     }
  64.  
  65.     string s;
  66.     cin >> s;
  67.     for(int i = 0; i < n; i++){
  68.         for(int j = 0; j < 2; j++){
  69.             h[j][i] = P[j][i] * s[i];
  70.             if(i)
  71.                 h[j][i] = (h[j][i] + h[j][i-1]) % md[j];
  72.         }
  73.     }
  74.  
  75.     cin >> A >> B >> C;
  76.  
  77. //    int d[N];
  78. //    for(int i = 0; i < N; i++)
  79. //        d[i] = INF;
  80. //    d[0] = 0;
  81. //    for(int i = 1; i < N; i++){
  82. //        d[i] = min(d[i],d[i-1]+A);
  83. //        for(int j = i + i, c = 2; j < N; j += i,c++)
  84. //            d[j] = min(d[j],d[i]+B+c*C);
  85. //    }
  86. //
  87. //    cout << d[s.size()];
  88. //    return;
  89.  
  90.     for(int i = 0; i < n; i++){
  91.         for(int j = i; j < n; j++){
  92.             dp[i][j] = (j-i+1)*A;
  93.         }
  94.     }
  95.  
  96.     for(int len = 1; len <= n; len++){
  97.         for(int i = 0; i + len - 1 < n; i++){
  98.             int j = i+len-1;
  99.  
  100.             for(int k = i; k <= j; k++){
  101.                 dp[i][j] = min(dp[i][j],dp[k][j]+(k-i)*A);
  102.                 dp[i][j] = min(dp[i][j],dp[i][k]+(j-k)*A);
  103.             }
  104.             int cur = dp[i][j]+B+C;
  105.             int pr = j;
  106.             for(int t = j+1; t < n;){
  107.                 cur += A;
  108.                 if(t - len + 1 > pr && compare(i,j,t-len+1,t)){
  109.                     cur = cur - len * A + C;
  110.                     pr = t;
  111.                 }
  112.                 dp[i][t] = min(dp[i][t],cur);
  113.                 t++;
  114.             }
  115.         }
  116.     }
  117.  
  118. //    cerr << "DEBUG " << dp[2][3] << "\n";
  119. //    cout << dp[0][2] << "\n";
  120.  
  121.     cout << dp[0][n-1];
  122.  
  123.     return;
  124. }
  125. signed main(){
  126.     ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
  127.     int tests = 1;
  128. //    cin >> tests;
  129.     while(tests--){
  130.         solve();
  131.     }
  132. }
  133. /**
  134. 18
  135. aababbbababbbaabbb
  136. 10000
  137. 1
  138. 100
  139.  
  140.  
  141. aaaaaa
  142.  
  143.  
  144. **/
  145.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement