Advertisement
Dang_Quan_10_Tin

STR

Apr 7th, 2022
852
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.18 KB | None | 0 0
  1. #define task "STR"
  2. #include <iostream>
  3. #include <cstdio>
  4.  
  5. using namespace std;
  6.  
  7. using ll = long long;
  8. using ld = long double;
  9.  
  10. constexpr int N = 5e3 + 5;
  11. constexpr int Inf = 1e9 + 7;
  12. string s, a, b;
  13. int n, m, p, valA, valB;
  14. int f[N][40][40], pa[40], pb[40];
  15.  
  16. void Read()
  17. {
  18.     cin >> s >> a >> b >> valA >> valB;
  19.  
  20.     m = a.size();
  21.     a = " " + a + ",";
  22.     p = b.size();
  23.     b = " " + b + ",";
  24.  
  25.     n = s.size();
  26.     s = " " + s;
  27. }
  28.  
  29. void Prepare(int pk[40], string a, int n)
  30. {
  31.     pk[1] = 0;
  32.  
  33.     for (int i = 2; i <= n; ++i)
  34.         for (int j = i - 1; j; --j)
  35.             if (a.substr(1, j) == a.substr(i - j + 1, j))
  36.             {
  37.                 pk[i] = j;
  38.                 break;
  39.             }
  40. }
  41.  
  42. void Solve()
  43. {
  44.     Prepare(pa, a, m);
  45.     Prepare(pb, b, p);
  46.  
  47.     fill_n(&f[0][0][0], N * 40 * 40, -Inf);
  48.     f[0][0][0] = 0;
  49.  
  50.     for (int i = 0; i < n; ++i)
  51.         for (int j = 0; j <= m; ++j)
  52.             for (int t = 0; t <= p; ++t)
  53.                 if (f[i][j][t] != -Inf)
  54.                 {
  55.                     if (s[i + 1] != '.')
  56.                     {
  57.                         int newj = j, newt = t;
  58.  
  59.                         while (newj && s[i + 1] != a[newj + 1])
  60.                             newj = pa[newj];
  61.  
  62.                         if (s[i + 1] == a[newj + 1])
  63.                             ++newj;
  64.  
  65.                         while (newt && s[i + 1] != b[newt + 1])
  66.                             newt = pb[newt];
  67.  
  68.                         if (s[i + 1] == b[newt + 1])
  69.                             ++newt;
  70.  
  71.                         int val = (newj == m && s[i + 1] == a[newj]) * valA + (newt == p && s[i + 1] == b[newt]) * valB;
  72.  
  73.                         f[i + 1][newj][newt] = max(f[i + 1][newj][newt], f[i][j][t] + val);
  74.                     }
  75.                     else
  76.                     {
  77.                         for (char _ = 'a'; _ <= 'z'; ++_)
  78.                         {
  79.                             s[i + 1] = _;
  80.  
  81.                             int newj = j, newt = t;
  82.  
  83.                             while (newj && s[i + 1] != a[newj + 1])
  84.                                 newj = pa[newj];
  85.  
  86.                             if (s[i + 1] == a[newj + 1])
  87.                                 ++newj;
  88.  
  89.                             while (newt && s[i + 1] != b[newt + 1])
  90.                                 newt = pb[newt];
  91.  
  92.                             if (s[i + 1] == b[newt + 1])
  93.                                 ++newt;
  94.  
  95.                             int val = (newj == m && s[i + 1] == a[newj]) * valA + (newt == p && s[i + 1] == b[newt]) * valB;
  96.  
  97.                             f[i + 1][newj][newt] = max(f[i + 1][newj][newt], f[i][j][t] + val);
  98.                         }
  99.  
  100.                         s[i + 1] = '.';
  101.                     }
  102.                 }
  103.  
  104.     int ans(-Inf);
  105.  
  106.     for (int i = 0; i <= m; ++i)
  107.         for (int j = 0; j <= p; ++j)
  108.             ans = max(ans, f[n][i][j]);
  109.  
  110.     cout << ans;
  111. }
  112.  
  113. int32_t main()
  114. {
  115.     ios_base::sync_with_stdio(0);
  116.     cin.tie(0);
  117.     cout.tie(0);
  118.  
  119.     if (fopen(task ".INP", "r"))
  120.     {
  121.         freopen(task ".INP", "r", stdin);
  122.         freopen(task ".OUT", "w", stdout);
  123.     }
  124.  
  125.     Read();
  126.     Solve();
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement