Fshl0

Untitled

Feb 22nd, 2022
969
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.79 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define F first
  3. #define S second
  4. #define pb push_back
  5.  
  6. using namespace std;
  7. typedef long long ll;
  8.  
  9. const int MOD = 1e9 + 7;
  10. const int mxP = 1e2 + 9;
  11. const int mxN = 1e5 + 9;
  12. const int INF = 1e7 + 7;
  13. const int mxK = 20;
  14. const double eps = 1e-7;
  15.  
  16. ll c[30], dp[mxN], last[30], segTree[4 * mxN];
  17.  
  18. void updateTree (ll v, ll l, ll r, ll idx, ll value) {
  19.     if (l == r) {
  20.         segTree[v] = value;
  21.        
  22.         return;
  23.     }
  24.    
  25.     ll mid = (l + r) / 2;
  26.     if (idx <= mid)
  27.         updateTree (2 * v, l, mid , idx, value);
  28.     else updateTree (2 * v + 1, mid + 1, r, idx, value);
  29.    
  30.     return;
  31. }
  32.  
  33. ll getMin (ll v, ll l, ll r, ll L, ll R) {
  34.     if (L <= l && r <= R)
  35.         return segTree[v];
  36.    
  37.     if (r < L || l > R)
  38.         return ll (1e17);
  39.    
  40.     ll mid = (l + r) / 2;
  41.     ll lm = getMin (2 * v, l, mid, L, R);
  42.     ll rm = getMin (2 * v + 1, mid + 1, r, L, R);
  43.    
  44.     return min (lm, rm);
  45. }
  46.  
  47. void solve () {
  48.     ll n;
  49.     cin >> n;
  50.    
  51.     string s;
  52.     cin >> s;
  53.     s = "3" + s;
  54.     s += "a";
  55.    
  56.     int m;
  57.     cin >> m;
  58.    
  59.     for (ll i = 1; i <= m; i++)
  60.         cin >> c[i];
  61.    
  62.     last[s[1] - 'a'] = 1;
  63.     for (ll i = 2; i <= n + 1; i++) {
  64.         vector <ll> v;
  65.        
  66.         v.pb (0);
  67.         for (ll i = 0; i < m; i++) {
  68.             if (last[i] != 0)
  69.                 v.pb (last[i]);
  70.         }
  71.        
  72.         sort (v.begin(), v.end());
  73.        
  74.         dp[i] = 1e9;
  75.         for (ll j = 1; j < (ll) v.size(); j++) {
  76.             dp[i] = min (dp[i], c[v.size() - j] + getMin (1, 1, n, v[j - 1] + 1, v[j]));
  77.         }
  78.        
  79.         //cout << i << ' ' << dp[i] << "\n";
  80.         updateTree (1, 1, n, i, dp[i]);
  81.         last[s[i] - 'a'] = i;
  82.     }
  83.    
  84.     cout << dp[n + 1] << "\n";
  85.     return;
  86. }
  87.  
  88. int main () {
  89.     ll t = 1;
  90.     //cin >> t;
  91.        
  92.     //preCalc ();
  93.     while (t--)
  94.         solve ();
  95.        
  96.     return 0;
  97. }
  98.  
  99. /*
  100.  *
  101.  *4
  102. abcd
  103.  26
  104. 2 3 5 10 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
  105.  *
  106.  *
  107.  *
  108.  *
  109.  */
  110.  
Advertisement
Add Comment
Please, Sign In to add comment