Facebook
From LoboLobo, 2 Years ago, written in C++.
Embed
Download Paste or View Raw
Hits: 249
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const long long inf = (long long) 1e18 + 10;
  5. const int inf1 = (int) 1e9 + 10;
  6. #define int long long
  7. #define dbl long double
  8. #define endl '\n'
  9. #define sc second
  10. #define fr first
  11. #define mp make_pair
  12. #define pb push_back
  13. #define all(x) x.begin(), x.end()
  14.  
  15. #define maxn 19
  16. #define maxp (1<<19)
  17.  
  18. int n, q, mark[maxn][maxp], dp[maxn][maxp];
  19. vector<int> nx[maxn];
  20.  
  21. int sol(int i, int mask) {
  22.     if(mark[i][mask]) return dp[i][mask];
  23.     mark[i][mask] = 1;
  24.     if(mask == 0) return dp[i][mask] = 1;
  25.  
  26.     int lsb = 31-__builtin_clz(mask&-mask);
  27.     dp[i][mask] = 0;
  28.     bool ok = false;
  29.     for(auto j : nx[i]) {
  30.         if(j == lsb) {
  31.             ok = true;
  32.             continue;
  33.         }
  34.         if((mask&(1<<j)) != 0) {
  35.             dp[i][mask]+= sol(j,mask - (1<<j));
  36.         }
  37.     }
  38.  
  39.     if(ok || i == lsb) {
  40.         int mask1 = mask - (1<<lsb);
  41.         int lsb1 = 31-__builtin_clz(mask1&-mask1);
  42.         dp[i][mask]+= sol(lsb1,mask1);
  43.     }
  44.  
  45.     return dp[i][mask];
  46. }
  47.  
  48. void solve() {
  49.     cin >> n;
  50.     for(int i = 0; i < n; i++) {
  51.         int posi;
  52.         vector<int> rank;
  53.         for(int j = 0; j < n; j++) {
  54.             int x; cin >> x;
  55.             x--;
  56.             rank.pb(x);
  57.             if(x == i) posi = j;
  58.         }
  59.  
  60.         for(int j = 0; j < posi; j++) {
  61.             nx[rank[j]].pb(i);
  62.         }
  63.     }
  64.  
  65.  
  66.     int q; cin >> q;
  67.     while(q--) {
  68.         string s; cin >> s;
  69.         int mask = 0;
  70.         for(int i = 0; i < n; i++) {
  71.             if(s[i] == 'H') mask+= (1<<i);
  72.         }
  73.         int mask1 = (1<<n)-1-mask;
  74.         cout << sol(31-__builtin_clz(mask&-mask),mask)*sol(31-__builtin_clz(mask1&-mask1),mask1) << endl;
  75.     }
  76. }
  77.  
  78. int32_t main() {
  79.     ios::sync_with_stdio(false); cin.tie(0);
  80.  
  81.     int tt = 1;
  82.     // cin >> tt;
  83.     while(tt--) solve();
  84.  
  85. }