Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define task "STR"
- #include <iostream>
- #include <cstdio>
- using namespace std;
- using ll = long long;
- using ld = long double;
- constexpr int N = 5e3 + 5;
- constexpr int Inf = 1e9 + 7;
- string s, a, b;
- int n, m, p, valA, valB;
- int f[N][40][40], pa[40], pb[40];
- void Read()
- {
- cin >> s >> a >> b >> valA >> valB;
- m = a.size();
- a = " " + a + ",";
- p = b.size();
- b = " " + b + ",";
- n = s.size();
- s = " " + s;
- }
- void Prepare(int pk[40], string a, int n)
- {
- pk[1] = 0;
- for (int i = 2; i <= n; ++i)
- for (int j = i - 1; j; --j)
- if (a.substr(1, j) == a.substr(i - j + 1, j))
- {
- pk[i] = j;
- break;
- }
- }
- void Solve()
- {
- Prepare(pa, a, m);
- Prepare(pb, b, p);
- fill_n(&f[0][0][0], N * 40 * 40, -Inf);
- f[0][0][0] = 0;
- for (int i = 0; i < n; ++i)
- for (int j = 0; j <= m; ++j)
- for (int t = 0; t <= p; ++t)
- if (f[i][j][t] != -Inf)
- {
- if (s[i + 1] != '.')
- {
- int newj = j, newt = t;
- while (newj && s[i + 1] != a[newj + 1])
- newj = pa[newj];
- if (s[i + 1] == a[newj + 1])
- ++newj;
- while (newt && s[i + 1] != b[newt + 1])
- newt = pb[newt];
- if (s[i + 1] == b[newt + 1])
- ++newt;
- int val = (newj == m && s[i + 1] == a[newj]) * valA + (newt == p && s[i + 1] == b[newt]) * valB;
- f[i + 1][newj][newt] = max(f[i + 1][newj][newt], f[i][j][t] + val);
- }
- else
- {
- for (char _ = 'a'; _ <= 'z'; ++_)
- {
- s[i + 1] = _;
- int newj = j, newt = t;
- while (newj && s[i + 1] != a[newj + 1])
- newj = pa[newj];
- if (s[i + 1] == a[newj + 1])
- ++newj;
- while (newt && s[i + 1] != b[newt + 1])
- newt = pb[newt];
- if (s[i + 1] == b[newt + 1])
- ++newt;
- int val = (newj == m && s[i + 1] == a[newj]) * valA + (newt == p && s[i + 1] == b[newt]) * valB;
- f[i + 1][newj][newt] = max(f[i + 1][newj][newt], f[i][j][t] + val);
- }
- s[i + 1] = '.';
- }
- }
- int ans(-Inf);
- for (int i = 0; i <= m; ++i)
- for (int j = 0; j <= p; ++j)
- ans = max(ans, f[n][i][j]);
- cout << ans;
- }
- int32_t main()
- {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- if (fopen(task ".INP", "r"))
- {
- freopen(task ".INP", "r", stdin);
- freopen(task ".OUT", "w", stdout);
- }
- Read();
- Solve();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement