Advertisement
Guest User

Untitled

a guest
Feb 25th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.60 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <set>
  5. #include <unordered_set>
  6. #include <map>
  7. #include <algorithm>
  8. #include <math.h>
  9. #include <queue>
  10. #include <stack>
  11. #include <time.h>
  12. #include <memory.h>
  13.  
  14. using namespace std;
  15.  
  16. typedef long long LL;
  17. typedef pair<int, int> PII;
  18. typedef vector<int> VI;
  19. typedef pair<double, double> PDD;
  20. const double PI = acos(-1.0);
  21.  
  22. #define FOR(i,a,b) for(int i=(a);i<(b);i++)
  23. #define RFOR(i,a,b) for(int i=(a)-1;i>=0;i--)
  24. #define PB push_back
  25. #define MP make_pair
  26. #define SZ(a) (int)a.size()
  27. #define ALL(a) (a.begin(),a.end())
  28. #define FILL(a, x) memset(a, x, sizeof(a));
  29.  
  30. const int MAX = 22;
  31.  
  32. int n, m, x, MOD;
  33.  
  34. map<int,int> DP[22][22][200];
  35. string S[22];
  36. bool A[22][22];
  37.  
  38. bool hasBit(int mask, int i) {
  39. return mask&(1 << i);
  40. }
  41.  
  42. void setBit(int& mask, int i) {
  43. mask |= (1 << i);
  44. }
  45.  
  46. void ADD(int& to, int x) {
  47. to += x;
  48. while (to >= MOD)to -= MOD;
  49. }
  50.  
  51. void solve() {
  52. DP[0][0][0][0] = 1;
  53. FOR(i, 0, n)
  54. FOR(j, 0, m)
  55. FOR(k, 0, x + 1) {
  56. for (map<int,int>::iterator it = DP[i][j][k].begin(); it != DP[i][j][k].end(); ++it)
  57. {
  58. int val = it->second;
  59. if (!val)continue;
  60. int msk = it->first;
  61. // cerr << i << " " << j << " " << k << " " <<" "<<msk<<" "<< val << endl;
  62.  
  63. int nI = i;
  64. int nJ = j + 1;
  65. if (nJ == m) {
  66. nI++;
  67. nJ = 0;
  68. }
  69.  
  70. bool canJoinUp = (i > 0 && !hasBit(msk, j));
  71.  
  72. if (canJoinUp) {
  73. bool plus1 = A[i - 1][j] == true && A[i][j] == true;
  74. int nk = k + plus1;
  75. if (nk<=x) {
  76. int nmask = msk;
  77. setBit(nmask, j);
  78. map<int, int>::iterator w = DP[nI][nJ][nk].find(nmask);
  79. if (w == DP[nI][nJ][nk].end()) {
  80. DP[nI][nJ][nk][nmask] = val;
  81. }
  82. else {
  83. ADD(w->second, val);
  84. }
  85. }
  86. continue;
  87. }
  88.  
  89.  
  90. bool canJoinLeft = (j > 0 && !hasBit(msk, j - 1));
  91. if (canJoinLeft) {
  92. bool plus1 = A[i][j - 1] == true && A[i][j] == true;
  93. int nk = k + plus1;
  94. if (nk<=x) {
  95. int nmask = msk;
  96. setBit(nmask, j);
  97. setBit(nmask, j - 1);
  98. // if(DP[nI][nJ][k + plus1].count(n)
  99. map<int, int>::iterator w = DP[nI][nJ][nk].find(nmask);
  100. if (w == DP[nI][nJ][nk].end()) {
  101. DP[nI][nJ][nk][nmask] = val;
  102. }
  103. else {
  104. ADD(w->second, val);
  105. }
  106. }
  107.  
  108. }
  109.  
  110. bool canSkip = true;//i == 0 || hasBit(msk, j);
  111.  
  112.  
  113. if (canSkip) {
  114. int nmask = msk;
  115. if (hasBit(nmask, j)) {
  116. nmask ^= 1 << j;
  117. }
  118.  
  119. map<int, int>::iterator w = DP[nI][nJ][k].find(nmask);
  120. if (w == DP[nI][nJ][k].end()) {
  121. DP[nI][nJ][k][nmask] = val;
  122. }
  123. else {
  124. ADD(w->second, val);
  125. }
  126. }
  127. }
  128. }
  129. }
  130. int main()
  131. {
  132. //ios::sync_with_stdio(0); cin.tie(0);
  133. string name = "08";
  134. freopen(("C:\\Users\\felix\\Desktop\\sets\\division"+name+".in").c_str(), "r", stdin);
  135. freopen(("C:\\Users\\felix\\Desktop\\sets\\division\\division" + name + ".ans").c_str(), "w", stdout);
  136. // freopen("in.txt", "r", stdin);
  137. //C:\Users\felix\Desktop\sets
  138.  
  139. int T;
  140. cin >> T;
  141. while (T--) {
  142. cin >> m >> n >> x >> MOD;
  143.  
  144.  
  145. cerr << T << endl;
  146. FOR(i, 0, n) {
  147. cin >> S[i];
  148. }
  149. if ((n*m) % 2 == 1) {
  150. cout << 0 << endl;
  151. continue;
  152. }
  153.  
  154. if (m > n) {
  155. FOR(i,0,n)
  156. FOR(j, 0, m) {
  157. A[j][i] = S[i][j] == 'A';
  158. }
  159. swap(n, m);
  160. }
  161. else {
  162. FOR(i, 0, n)
  163. FOR(j, 0, m)
  164. A[i][j] = S[i][j] == 'A';
  165. }
  166.  
  167. FOR(i, 0, n + 1)
  168. FOR(j,0,m)
  169. FOR(k,0,x+1){
  170. DP[i][j][k].clear();
  171. }
  172.  
  173. solve();
  174.  
  175. int mm = (1 << m) - 1;
  176. int ans = 0;
  177. if (DP[n][0][x].count(mm)) {
  178. ans = DP[n][0][x][mm];
  179. }
  180.  
  181. cout << ans << "\n";
  182. }
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement