Advertisement
Guest User

NAC 2020 I

a guest
Feb 25th, 2020
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.34 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int MX = 60000, MOD = 998244353;
  5.  
  6. int m, mx, ans = 0, dp[2][MX];
  7. string s;
  8.  
  9. vector<int> convert(int u) {
  10.     vector<int> ve;
  11.     for (int i = 0; i < s.size(); i++, u /= 3) {
  12.         ve.push_back(u % 3 - 1);
  13.     }
  14.     reverse(ve.begin(), ve.end());
  15.     return ve;
  16. }
  17.  
  18. int main() {
  19.     ios_base::sync_with_stdio(false);
  20.     cin.tie(nullptr);
  21.     cin >> s >> m;
  22.     mx = pow(3, s.size());
  23.     dp[0][mx - 1] = 1;
  24.     for (int i = 1; i <= 20; i++) {
  25.         int cur = i & 1, prv = cur ^ 1;
  26.         fill(dp[cur], dp[cur] + MX, 0);
  27.         for (int j = 0; j < mx; j++) {
  28.             if (dp[prv][j] == 0) {
  29.                 continue;
  30.             }
  31.             vector<int> ve = convert(j);
  32.             for (char c = 'A'; c <= 'Z'; c++) {
  33.                 int msk = 0, di = i - 1, up = i - 1, le = i;
  34.                 for (int k = 0; k < s.size(); k++) {
  35.                     up += ve[k];
  36.                     int at = min(min(up, le) + 1, di + (c != s[k]));
  37.                     (msk *= 3) += at - le + 1;
  38.                     di = up; le = at;
  39.                 }
  40.                 (dp[cur][msk] += dp[prv][j]) %= MOD;
  41.                 if (le == m) {
  42.                     (ans += dp[prv][j]) %= MOD;
  43.                 }
  44.             }
  45.         }
  46.     }
  47.     cout << (ans + ((int)s.size() == m)) % MOD;
  48. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement