Advertisement
tien_noob

d13seed

Sep 5th, 2021
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.26 KB | None | 0 0
  1. //Make CSP great again
  2. #include <bits/stdc++.h>
  3. #define TASK "TESTCODE"
  4. using namespace std;
  5. int Next[(1 << 17) + 1][2];
  6. long long dp[200][(1 << 17) + 1];
  7. int n;
  8. string s, t;
  9. bitset<(1 << 17) + 1> Ans;
  10. struct Trie
  11. {
  12.     struct node
  13.     {
  14.         int child[2];
  15.     };
  16.     vector<node> Tree;
  17.     void new_node()
  18.     {
  19.         node tmp;
  20.         for (int i = 0; i < 2; ++ i)
  21.         {
  22.             tmp.child[i] = -1;
  23.         }
  24.         Tree.push_back(tmp);
  25.     }
  26.     void add_num(string & num)
  27.     {
  28.         int id = 0;
  29.         for (char c : num)
  30.         {
  31.             int w = c - '0';
  32.             if (Tree[id].child[w] == -1)
  33.             {
  34.                 new_node();
  35.                 Tree[id].child[w] = Tree.size() - 1;
  36.             }
  37.             id = Tree[id].child[w];
  38.         }
  39.         Ans.set(id, 1);
  40.     }
  41.     int get(string & num)
  42.     {
  43.         int id = 0;
  44.         for (char c : num)
  45.         {
  46.             int w = c - '0';
  47.             if (Tree[id].child[w] == -1)
  48.             {
  49.                 return -1;
  50.             }
  51.             id = Tree[id].child[w];
  52.         }
  53.         return id;
  54.     }
  55.     void BuildNext(int id, string num)
  56.     {
  57.         if (num.length() == t.length())
  58.         {
  59.             Next[id][0] = id;
  60.             Next[id][1] = id;
  61.             return ;
  62.         }
  63.         for (char c = '0'; c < '2'; ++ c)
  64.         {
  65.             if (Tree[id].child[c - '0'] != -1)
  66.             {
  67.                 Next[id][c - '0'] = Tree[id].child[c - '0'];
  68.                 BuildNext(Tree[id].child[c -'0'], num + c);
  69.             }
  70.             else
  71.             {
  72.                 string tmp = num + c;
  73.                 while(get(tmp) == -1)
  74.                 {
  75.                     tmp.erase(0, 1);
  76.                 }
  77.                 Next[id][c - '0'] = get(tmp);
  78.             }
  79.         }
  80.     }
  81.     int CountNode()
  82.     {
  83.         return Tree.size() - 1;
  84.     }
  85. };
  86. Trie Tree;
  87. void Gen(int i)
  88. {
  89.     if (i == t.length())
  90.     {
  91.         Tree.add_num(t);
  92.         return ;
  93.     }
  94.     if (s[i] == '1')
  95.     {
  96.         t[i] = '1';
  97.         Gen(i + 1);
  98.     }
  99.     else
  100.     {
  101.         for (char c = '0'; c <= '1'; ++ c)
  102.         {
  103.             t[i] = c;
  104.             Gen(i + 1);
  105.         }
  106.     }
  107. }
  108. void read()
  109. {
  110.     cin >> n >> s;
  111.     Tree.new_node();
  112.     while(s.back() == '*')
  113.     {
  114.         s.pop_back();
  115.     }
  116.     t.resize(s.length());
  117.     dp[0][0] = 1;
  118. }
  119. void solve()
  120. {
  121.     Gen(0);
  122.     Tree.BuildNext(0, "");
  123.     long long res = 0;
  124.     for (int i = 0; i < n; ++ i)
  125.     {
  126.         for (int j = 0; j <= Tree.CountNode(); ++ j)
  127.         {
  128.             dp[i + 1][Next[j][0]] += dp[i][j];
  129.             dp[i + 1][Next[j][1]] += dp[i][j];
  130.         }
  131.     }
  132.     for (int i = 0; i <= Tree.CountNode(); ++ i)
  133.     {
  134.         if(Ans.test(i))
  135.         {
  136.             res += dp[n][i];
  137.         }
  138.     }
  139.     cout << res;
  140. }
  141. int main()
  142. {
  143.     ios_base::sync_with_stdio(false);
  144.     cin.tie(nullptr);
  145.     if (fopen(TASK".INP", "r"))
  146.     {
  147.         freopen(TASK".INP", "r", stdin);
  148.         //freopen(TASK".OUT", "w", stdout);
  149.     }
  150.     int t = 1;
  151.     bool typetest = false;
  152.     if (typetest)
  153.     {
  154.         cin >> t;
  155.     }
  156.     for (int __ = 1; __ <= t; ++ __)
  157.     {
  158.         //cout << "Case " << __ << ": ";
  159.         read();
  160.         solve();
  161.     }
  162. }
  163.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement