Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define F first
- #define S second
- #define pb push_back
- using namespace std;
- typedef long long ll;
- const int MOD = 1e9 + 7;
- const int mxP = 1e2 + 9;
- const int mxN = 1e5 + 9;
- const int INF = 1e7 + 7;
- const int mxK = 20;
- const double eps = 1e-7;
- ll c[30], dp[mxN], last[30], segTree[4 * mxN];
- void updateTree (ll v, ll l, ll r, ll idx, ll value) {
- if (l == r) {
- segTree[v] = value;
- return;
- }
- ll mid = (l + r) / 2;
- if (idx <= mid)
- updateTree (2 * v, l, mid , idx, value);
- else updateTree (2 * v + 1, mid + 1, r, idx, value);
- return;
- }
- ll getMin (ll v, ll l, ll r, ll L, ll R) {
- if (L <= l && r <= R)
- return segTree[v];
- if (r < L || l > R)
- return ll (1e17);
- ll mid = (l + r) / 2;
- ll lm = getMin (2 * v, l, mid, L, R);
- ll rm = getMin (2 * v + 1, mid + 1, r, L, R);
- return min (lm, rm);
- }
- void solve () {
- ll n;
- cin >> n;
- string s;
- cin >> s;
- s = "3" + s;
- s += "a";
- int m;
- cin >> m;
- for (ll i = 1; i <= m; i++)
- cin >> c[i];
- last[s[1] - 'a'] = 1;
- for (ll i = 2; i <= n + 1; i++) {
- vector <ll> v;
- v.pb (0);
- for (ll i = 0; i < m; i++) {
- if (last[i] != 0)
- v.pb (last[i]);
- }
- sort (v.begin(), v.end());
- dp[i] = 1e9;
- for (ll j = 1; j < (ll) v.size(); j++) {
- dp[i] = min (dp[i], c[v.size() - j] + getMin (1, 1, n, v[j - 1] + 1, v[j]));
- }
- //cout << i << ' ' << dp[i] << "\n";
- updateTree (1, 1, n, i, dp[i]);
- last[s[i] - 'a'] = i;
- }
- cout << dp[n + 1] << "\n";
- return;
- }
- int main () {
- ll t = 1;
- //cin >> t;
- //preCalc ();
- while (t--)
- solve ();
- return 0;
- }
- /*
- *
- *4
- abcd
- 26
- 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
- *
- *
- *
- *
- */
Advertisement
Add Comment
Please, Sign In to add comment