Number of Ways to Wear Different Hats to Each Other LeetCode solution in Java
1class Solution {2public int numberWays(List<List<Integer>> hats) {3int n = hats.size(), M = (int) 1e9 + 7;4int[] mask = new int[41];5for (int i = 0; i < n; i++) {6for (int h : hats.get(i)) {7mask[h] |= 1 << i;8}9}10int[] dp = new int[1 << n];11dp[0] = 1;12for (int i = 0; i <= 40; i++) {13for (int j = (1 << n) - 1; j >= 0 && mask[i] > 0; j--) {14for (int k = 0; k < n && (mask[i] & j) > 0; k++) {15if ((1 << k & j) > 0 && (1 << k & mask[i]) > 0) {16dp[j] += dp[j ^ 1 << k];17dp[j] %= M;18}19}20}21}2223return dp[(1 << n) - 1];24}25}