HackerRank Vim War Problem Solution Yashwant Parihar, August 24, 2023August 1, 2024 In this post, we will solve HackerRank Vim War Problem Solution. A war has broken down between Vim and Emacs. Gedit, being Vim’s ally, is captured byEmacs as a prisoner of war and it is up to Vim to rescue him by defeating Emacs.For this task, Vim has to assemble an army of appropriate skills. He can choose a non- empty subset of soldiers from a set of N soldiers (numbered from 1 to N). Each soldier has some subset of skills out of M different skills (numbered from 1 to M). The skill-set of an army is the union of skill-sets of its constituent soldiers. To win the war, Vim needs to know how many different subsets of soldiers satisfy his skill-set requirement. Since the answer can be huge, print it modulo 10″ + 7.Note: The chosen army’s skill-set must exactly match the skill-set requirement of Vim (i.e no extra skills must be present in the army’s skill-set than what is required).Input FormatThe first line contains N and M. the number of soldiers to choose from and the number of different skills possible respectively.The next N lines contain M boolean characters each. If the jth character of the ¿th line is 1 , then the ith soldier possess the jth skill and if it is 0, then not.The last line contains M boolean characters denoting the requirement skill-set of Vim where the jth character being 1 signifies that Vim wants the jth skill to be present in his final army and not, otherwise. Output Format Output in a single line the required answer, as explained above. Sample Input 4 2 00 10 01 11 11 Sample Output 10 HackerRank Vim War Problem Solution Vim War C Solution #include <stdio.h> #include <string.h> #include <stdbool.h> #define MAX 1048576 #define MOD 1000000007 #define clr(ar) memset(ar, 0, sizeof(ar)) #define read() freopen("lol.txt", "r", stdin) int n, m, r, pos[25], ar[MAX], temp[MAX], P[MAX], dp[MAX][2]; int Solve(){ int i, j, k, x, y, u, v, bitmask; clr(dp); for (i = 0; i < n; i++) dp[ar[i]][0]++; for (j = 1; j < 21; j++){ u = j & 1; v = (j - 1) & 1; for (i = 0; i < MAX; i++){ if (i & (1 << (j - 1))) dp[i][u] = dp[i][v]; else dp[i][u] = (dp[i][v] + dp[i + (1 << (j - 1))][v]); } } int res = P[n]; for (bitmask = 1; bitmask < MAX; bitmask++){ x = dp[bitmask][0]; if (x){ if (__builtin_popcount(bitmask) & 1) res = (res - P[x] + MOD) % MOD; else res = (res + P[x]) % MOD; } } return res; } int main(){ char str[25]; int i, j, k, x, lim; P[0] = 1; for (i = 1; i < MAX; i++) P[i] = (P[i - 1] << 1) % MOD; for (i = 0; i < MAX; i++) P[i] = (P[i] - 1 + MOD) % MOD; while (scanf("%d %d", &n, &m) != EOF){ for (i = 0; i <= n; i++){ x = 0; scanf("%s", str); for (j = 0; str[j]; j++) x = (x << 1) + (str[j] - 48); temp[i] = x; } r = n; n = 0, k = 0; memset(pos, -1, sizeof(pos)); for (j = 0; j < m; j++){ if (temp[r] & (1 << j)) pos[j] = k++; } lim = (1 << k) - 1; for (i = 0; i < r; i++){ x = 0, k = 0; for (j = 0; j < m; j++){ if (temp[i] & (1 << j)){ if (pos[j] == -1){ k = 1; break; } x |= (1 << pos[j]); } } if (!k) ar[n++] = x ^ lim; } printf("%d\n", Solve()); } return 0; } Vim War C++ Solution #include <bits/stdc++.h> #define TestBit(bits, x) ((bits & (1LL << (x))) != 0) using namespace std; typedef long long ULL; ULL MOD = 1000000007; ULL target; int N, M; vector<ULL> skills; ULL Multiply(ULL a, ULL b) { a %= MOD; b %= MOD; ULL res = (a * b) % MOD; return (res < 0) ? res + MOD : res; } ULL Power(ULL n, ULL e) { ULL res = 1; while(e) { if(e & 1) { res = Multiply(res, n); } e >>= 1; n = Multiply(n, n); } return (res < 0) ? res + MOD : res; } ULL counts[1048576] = {0}; ULL Solve() { for(int bit = 0; bit < M; bit++) { for(int mask = 0; mask < (1 << M); mask++) { if(TestBit(mask, bit)) { counts[mask] += counts[mask ^ (1 << bit)]; } } } ULL res = 0; for(ULL mask = target; mask >= 0; mask--) { if((mask | target) != target) { continue; } ULL bits = target ^ mask; ULL count = __builtin_popcount(bits); ULL add = (Power(2, counts[mask]) - 1 + MOD) % MOD; if(count % 2) { add = MOD - add; } res = (res + add) % MOD; } return (res < 0) ? res + MOD : res; } int main() { cin >> N >> M; string s; ULL mask; for(int i = 0; i < N; i++) { cin >> s; mask = bitset<20>(s).to_ullong(); counts[mask]++; } cin >> s; target = bitset<20>(s).to_ullong(); cout << Solve(); return 0; } /* 10 6 101010 100000 000011 001001 100010 100001 001000 000000 100011 1100010 101011 4 4 1000 0011 1001 1010 1011 */ Vim War C Sharp Solution using System; using System.Collections.Generic; using System.Linq; class Solution { const int MOD = 1000000007; static void Main(String[] args) { long[] two = new long[100001]; two[0] = 1; for (int i = 1; i < 100001; i++) { two[i] = (2 * two[i - 1]) % MOD; } var tmp = Console.ReadLine().Split(' '); int n = int.Parse(tmp[0]); int m = int.Parse(tmp[1]); List<int> skills = new List<int>(); for (int i = 0; i < n; i++) { skills.Add(Convert.ToInt32(Console.ReadLine().Trim(), 2)); } int req = Convert.ToInt32(Console.ReadLine().Trim(), 2); int[,] count = new int[1 << 20, 21]; int m2 = m; for (int i = 0; i < m; i++) { if ((req & (1 << i)) == 0) m2--; } for (int i = 0; i < n; i++) { int k = 0; if (((req ^ skills[i]) & skills[i]) != 0) continue; for (int j = 0; j < m; j++) { if (((req >> j) & 1) == 1) { k *= 2; if ((skills[i] & (1 << j)) != 0) k++; } } count[k, m2]++; } for (int j = m2; j > 0; j--) { for (int i = 0; i < (1 << m2); i++) { count[i, j - 1] += count[i, j]; int val = (i & (1 << (j - 1))); if (val == 0) { count[i | (1 << (j - 1)), j - 1] += count[i, j]; } } } long ans = 0; for (int i = 0; i < (1 << m2); i++) { int cnt = 0; for (int j = i; j > 0; j >>= 1) { cnt += j & 1; } long val = two[count[i, 0]]; if (cnt % 2 == m2 % 2) ans = (ans + val) % MOD; else ans = (ans - val + MOD) % MOD; } if(req == 0) ans--; Console.WriteLine(ans); } } Vim War Java Solution import java.io.*; import java.util.*; import java.text.*; import java.math.*; import java.util.regex.*; public class Solution { private static final int MAX_N= 100000; private static final int MAX_M= 20; private static final int MODULO= 1000000007; public static void main(String[] args) throws Exception { Scanner in = new Scanner(System.in); String str; int [] skills = new int[MAX_N]; int [][] f = new int [1<< MAX_M][MAX_M + 1]; int n = in.nextInt(); int m = in.nextInt(); in.nextLine(); for (int i = 0; i < n; i++) { boolean ok = true; str = ""; while (ok) { str = in.nextLine(); ok = !(str != ""); } int value = 0; for (int j = 0; j < m; j++) value = value * 2 + (str.charAt(j) - '0'); skills[i] = value; } int target = 0; int nuevo_m = 0; str = ""; str = in.nextLine(); for (int i = 0; i < m; i++) { if (str.charAt(i) == '1') { target = target * 2 + 1; nuevo_m++; } } for (int i = 0; i < n; i++) { int value = 0; boolean flag = true; for (int j = m - 1; j >= 0; j--) { if (str.charAt(m - j - 1) == '1') { if ( (skills[i] & (1 << j)) != 0) value = value * 2 + 1; else value *= 2; } else { if ( (skills[i] & (1 << j) ) != 0 ) { flag = false; break; } } } if (flag) f[value][nuevo_m]++; } for (int j = nuevo_m; j > 0; j--) { for (int i = 0; i < (1 << nuevo_m); i++) { f[i][j - 1] += f[i][j]; int value = (i & (1 << (j - 1))); if (value == 0) { f[i | (1 << (j - 1))][j - 1] += f[i][j]; } } } int respuesta = 0; for (int i = 0; i < (1 << nuevo_m); i++) { int cnt = 0; for (int j = 0; j < nuevo_m; j++) { if ( (i & (1 << j)) != 0) cnt++; } int value = getMod(2, f[i][0]); if (cnt % 2 == nuevo_m % 2) respuesta = (respuesta + value) % MODULO; else respuesta = (respuesta - value + MODULO) % MODULO; } if (target == 0) System.out.println( (respuesta - 1 + MODULO) % MODULO); else System.out.println(respuesta); } private static int getMod(int x, int y) { long res = 1 % MODULO; long value = x % MODULO; while (y>0) { if ( (y & 1) != 0 ) res = (res * value) % MODULO; value = (value * value) % MODULO; y >>= 1; } return (int)res; } } Vim War Python Solution #!/bin/python3 import math import os import random import re import sys p = (10**9) + 7 def bool_vector(x): return int(x, base=2) def powers_of_two(n): x = 1 for i in range(n): yield x x = (x<<1) %p def count_C(m, skills): C = [0]*(1<<m) for x in skills: C[x] += 1 for k in reversed(range(m)): k0 = 1<<k for j1 in range(0,1<<m, k0<<1): for j in range(j1, j1|k0): C[j|k0] += C[j] return C def subset(a,b): return a&b == a def count_with_C(m, requirements, skills): remap, new_m = shuffle_bits(requirements) skills = [bool_vector(remap(skill)) for skill in skills] requirements = bool_vector(remap(requirements)) skills = [skill for skill in skills if subset(skill, requirements)] m = new_m two_pow = list(powers_of_two(len(skills)+1)) C = [two_pow[c] for c in count_C(m, skills)] max_range = (1 << m) >>1 while max_range > 0: for j in range(max_range): C[j] = (C[j] - C[j|max_range]) %p max_range >>= 1 res = C[0] if m%2==1: res = (-res) % p if requirements == 0: ## the empty set does not count res -= 1 return res def shuffle_bits(r): ones = [i for i,x in enumerate(r) if x=='1'] zeros = [i for i,x in enumerate(r) if x=='0'] order = zeros + ones def f(x): return ''.join(x[i] for i in order) return f, len(ones) # # Complete the 'vimWar' function below. # # The function is expected to return an INTEGER. # The function accepts following parameters: # 1. STRING_ARRAY skills # 2. STRING requirement # if __name__ == '__main__': fptr = open(os.environ['OUTPUT_PATH'], 'w') n, m = map(int, input().split()) skills = [input().strip() for _ in range(n)] requirements = input().strip() result = count_with_C(m, requirements, skills) fptr.write(str(result) + '\n') fptr.close() c C# C++ HackerRank Solutions java javascript python CcppCSharpHackerrank Solutionsjavajavascriptpython