@@ -243,27 +243,29 @@ The following code illustrates this:
243
243
const int MOD = 1000003;
244
244
245
245
int howMany(vector<string> patterns, int k) {
246
- vector<vector<int>> dp(50, vector<int>((1 << (int)patterns.size())));
247
- for (int i = 0; i < (int)patterns[0].size(); i++) {
246
+ int n = patterns.size();
247
+ int m = patterns[0].size();
248
+ vector<vector<int>> dp(50, vector<int>(1 << n));
249
+ for (int i = 0; i < m; i++) {
248
250
for (char c = 'a'; c <= 'z'; c++) {
249
251
int mask = 0;
250
- for (int j = 0; j < (int)patterns.size() ; j++) {
252
+ for (int j = 0; j < n ; j++) {
251
253
if (patterns[j][i] == c || patterns[j][i] == '?') { mask |= (1 << j); }
252
254
}
253
255
if (i == 0) {
254
256
dp[i][mask]++;
255
257
} else {
256
- for (int j = 0; j < (1 << (int)patterns.size() ); j++) {
258
+ for (int j = 0; j < (1 << n ); j++) {
257
259
dp[i][j & mask] = (dp[i][j & mask] + dp[i - 1][j]) % MOD;
258
260
}
259
261
}
260
262
}
261
263
}
262
264
263
265
int ans = 0;
264
- for (int mask = 0; mask < (1 << (int)patterns.size() ); mask++) {
266
+ for (int mask = 0; mask < (1 << n ); mask++) {
265
267
if (__builtin_popcount(mask) == k) {
266
- ans = (ans + dp[(int)patterns[0].size() - 1][mask]) % MOD;
268
+ ans = (ans + dp[m - 1][mask]) % MOD;
267
269
}
268
270
}
269
271
304
306
const int MOD = 1000003;
305
307
306
308
int howMany(vector<string > patterns, int k) {
309
+ int n = patterns .size ();
310
+ int m = patterns [0 ].size ();
307
311
int ans = 0 ;
308
- for (int mask = 0 ; mask < (1 << ( int ) patterns . size () ); mask ++ ) {
312
+ for (int mask = 0 ; mask < (1 << n ); mask ++ ) {
309
313
// subsets with exactly k patterns matters
310
314
if (__builtin_popcount (mask ) != k) { continue ; }
311
315
// iterate over all superset of current subset mask
312
- for (int supermask = mask ; supermask < (1 << ( int )patterns.size() );
316
+ for (int supermask = mask ; supermask < (1 << n );
313
317
supermask++) {
314
318
if ((mask & supermask ) != mask ) { continue ; }
315
319
int sign = ((__builtin_popcount (supermask ) - k ) & 1 ? - 1 : 1 );
316
320
int freq = 1 ; // checks how many valid strings satisfy the supermask
317
- for (int i = 0 ; i < ( int ) patterns [ 0 ]. size () ; i ++ ) {
321
+ for (int i = 0 ; i < m ; i ++ ) {
318
322
bool flag = true ;
319
323
char last_letter = ' ?' ;
320
- for (int j = 0 ; j < ( int ) patterns . size () ; j ++ ) {
324
+ for (int j = 0 ; j < n ; j ++ ) {
321
325
if (((1 << j ) & supermask ) == 0 ) { continue ; }
322
326
// check for conflicts if the pattern specifies a letter not '?'
323
327
if (patterns [j ][i ] != ' ?' ) {
0 commit comments