Advertisement
Diogo03

Atcoder_dp_impossível

Jul 8th, 2024
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.54 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4. using u = unsigned;
  5. constexpr u MOD = 998244353;
  6.  
  7.  
  8. // Função para verificar se um número binário representa um palíndromo
  9. bool is_palindrome(u num, u k) {
  10.     u l = 0, r = k - 1;
  11.     while (l < r){
  12.         char left = (1 & (num >> l)) ? 'A' : 'B';
  13.         char right = (1 & (num >> r)) ? 'A' : 'B';
  14.         if(left !=  right){
  15.             return false;
  16.         }
  17.         r--; l++;
  18.     }
  19.     return true;
  20. }
  21.  
  22. // Função para inicializar a lista de não-palíndromos
  23. vector<u> generate_not_palindrome(u k) {
  24.     vector<u> not_palindrome;
  25.     for (u i = 0; i < (1U << k); ++i) {
  26.         if (!is_palindrome(i, k)) {
  27.             not_palindrome.emplace_back(i);
  28.         } // else {
  29.         //     cout << "Palindromo: ";
  30.         //     for(int j = k - 1; j >= 0; j--)
  31.         //         cout << ((i & (1 << j)) ? 'A' : 'B');
  32.         //     cout << endl;
  33.         // }
  34.     }
  35.     return not_palindrome;
  36. }
  37.  
  38. // Função para inicializar a dp com base na string s
  39. void initialize_dp(vector<u>& dp, const string& s, u k) {
  40.     u a_mask = 0, q_mask = 0;
  41.     for (u i = 0; i < k - 1; ++i) {
  42.         a_mask = (a_mask * 2) + (s[i] == 'A');
  43.         q_mask = (q_mask * 2) + (s[i] != '?');
  44.         // cout << "q_mask = " << q_mask << endl;
  45.     }
  46.     for (u i = q_mask; i < (1U << (k - 1)); ++i) {
  47.         if ((i & q_mask) == q_mask) {
  48.             dp[i ^ a_mask] = 1;
  49.         }
  50.     }
  51. }
  52.  
  53. void solve() {
  54.     u n, k;
  55.     cin >> n >> k;
  56.  
  57.     auto not_palindrome = generate_not_palindrome(k);
  58.     string s;
  59.     cin >> s;
  60.  
  61.     vector<u> dp(1U << (k - 1), 0), prev(1U << (k - 1), 0);
  62.     initialize_dp(dp, s, k);
  63.  
  64.     for(auto i : dp){
  65.         cout << i << " ";
  66.     }
  67.     cout << endl;
  68.  
  69.     const u mask = (1U << (k - 1)) - 1;
  70.     for (u idx = k - 1; idx < s.size(); ++idx) {
  71.         swap(dp, prev);
  72.         fill(dp.begin(), dp.end(), 0);
  73.         if (s[idx] != 'B') {
  74.             for (const auto i : not_palindrome) {
  75.                 if (!(i & 1)) {
  76.                     dp[i & mask] = (dp[i & mask] + prev[i / 2]) % MOD;
  77.                 }
  78.             }
  79.         }
  80.         if (s[idx] != 'A') {
  81.             for (const auto i : not_palindrome) {
  82.                 if (i & 1) {
  83.                     dp[i & mask] = (dp[i & mask] + prev[i / 2]) % MOD;
  84.                 }
  85.             }
  86.         }
  87.     }
  88.     u result = 0;
  89.     for (const auto val : dp) {
  90.         result = (result + val) % MOD;
  91.     }
  92.     cout << result << endl;
  93. }
  94.  
  95. int main() {
  96.     solve();
  97.     return 0;
  98. }
  99.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement