1+ // vim-war.cpp
2+ // Vim War
3+ // Week of Code 16
4+ // Author: derekhh
5+ // Jul 9, 2015
6+
7+ #include < cstdio>
8+ #include < cstring>
9+ using namespace std ;
10+
11+ const int MAXN = 100000 ;
12+ const int MAXM = 20 ;
13+ const int MOD = 1000000007 ;
14+
15+ int originalSkill[MAXN];
16+ int f[1 << MAXM][MAXM + 1 ];
17+
18+ int modexp (int a, int b) {
19+ long long res = 1 % MOD, val = a % MOD;
20+ while (b) {
21+ if (b & 1 )
22+ res = (res * val) % MOD;
23+ val = (val * val) % MOD;
24+ b >>= 1 ;
25+ }
26+ return (int )res;
27+ }
28+
29+ int main () {
30+ int n, m;
31+ char str[MAXM + 1 ];
32+ scanf (" %d %d\n " , &n, &m);
33+ for (int i = 0 ; i < n; i++) {
34+ scanf (" %s" , str);
35+ int val = 0 ;
36+ for (int j = 0 ; j < m; j++)
37+ val = val * 2 + (str[j] - ' 0' );
38+ originalSkill[i] = val;
39+ }
40+ int target = 0 , newm = 0 ;
41+ scanf (" %s" , str);
42+ for (int i = 0 ; i < m; i++) {
43+ if (str[i] == ' 1' ) {
44+ target = target * 2 + 1 ;
45+ newm++;
46+ }
47+ }
48+
49+ for (int i = 0 ; i < n; i++) {
50+ int val = 0 ;
51+ bool flag = true ;
52+ for (int j = m - 1 ; j >= 0 ; j--) {
53+ if (str[m - j - 1 ] == ' 1' ) {
54+ if (originalSkill[i] & (1 << j)) val = val * 2 + 1 ;
55+ else val *= 2 ;
56+ }
57+ else {
58+ if (originalSkill[i] & (1 << j)) {
59+ flag = false ;
60+ break ;
61+ }
62+ }
63+ }
64+ if (flag) f[val][newm]++;
65+ }
66+
67+ for (int j = newm; j > 0 ; j--) {
68+ for (int i = 0 ; i < (1 << newm); i++) {
69+ f[i][j - 1 ] += f[i][j];
70+ int val = (i & (1 << (j - 1 )));
71+ if (val == 0 ) {
72+ f[i | (1 << (j - 1 ))][j - 1 ] += f[i][j];
73+ }
74+ }
75+ }
76+
77+ /*
78+ for (int i = 0; i < (1 << newm); i++) {
79+ printf("f[%d][0] = %d\n", i, f[i][0]);
80+ }
81+ */
82+
83+ int ans = 0 ;
84+ for (int i = 0 ; i < (1 << newm); i++) {
85+ int cnt = 0 ;
86+ for (int j = 0 ; j < newm; j++) {
87+ if (i & (1 << j))
88+ cnt++;
89+ }
90+ int val = modexp (2 , f[i][0 ]);
91+ if (cnt % 2 == newm % 2 ) ans = (ans + val) % MOD;
92+ else ans = (ans - val + MOD) % MOD;
93+ }
94+ if (target == 0 )
95+ printf (" %d\n " , (ans - 1 + MOD) % MOD);
96+ else
97+ printf (" %d\n " , ans);
98+ return 0 ;
99+ }
0 commit comments