Gardener and the Array (Codeforces 1775B)
Tags: Others, bitmasks

The gardener Kazimir Kazimirovich has an array of $$$n$$$ integers $$$c_1, c_2, \dots, c_n$$$.He wants to check if there are two different subsequences $$$a$$$ and $$$b$$$ of the original array, for which $$$f(a) = f(b)$$$, where $$$f(x)$$$ is the bitwise OR of all of the numbers in the sequence $$$x$$$.A sequence $$$q$$$ is a subsequence of $$$p$$$ if $$$q$$$ can be obtained from $$$p$$$ by deleting several (possibly none or all) elements.Two subsequences are considered different if the sets of indexes of their elements in the original sequence are different, that is, the values of the elements are not considered when comparing the subsequences.  

Input: Each test contains multiple test cases. The first line contains the number of test cases $$$t$$$ ($$$1 \le t \le 10^5$$$). The description of the test cases follows.The first line of each test case contains one integer $$$n$$$ ($$$1 \le n \le 10^5$$$) — the size of the array $$$c$$$.The description of the array $$$c$$$ in this problem is given implicitly to speed up input.The $$$(i + 1)$$$-st of the following $$$n$$$ lines of the test case begins with an integer $$$k_i$$$ ($$$1 \le k_i \le 10^5$$$) — the number of set bits in the number $$$c_i$$$. Next follow $$$k_i$$$ distinct integers $$$p_{i, 1}, p_{i, 2}, \dots, p_{i, k_i}$$$ ($$$1 \le p_i \le 2 \cdot 10^5$$$) —the numbers of bits that are set to one in number $$$c_i$$$. In other words, $$$c_i = 2^{p_{i, 1}} + 2^{p_{i, 2}} + \ldots + 2^{p_{i, k_i}}$$$.It is guaranteed that the total sum of $$$k_i$$$ in all tests does not exceed $$$10^5$$$.

Output: For each set of input, print "Yes" if there exist two different subsequences for which $$$f(a) = f(b)$$$, and "No" otherwise.You can output the answer in any case (upper or lower). For example, the strings "yEs", "yes", "Yes", and "YES" will be recognized as positive responses.

Note: It can be proven that in the first test case there are no two different subsequences $$$a$$$ and $$$b$$$ for which $$$f(a) = f(b)$$$.In the second test case, one of the possible answers are following subsequences: the subsequence $$$a$$$ formed by the element at position $$$1$$$, and the subsequence $$$b$$$ formed by the elements at positions $$$1$$$ and $$$2$$$.In the third test case, one of the possible answers are following subsequences: the subsequence $$$a$$$ formed by elements at positions $$$1$$$, $$$2$$$, $$$3$$$ and $$$4$$$, and the subsequence $$$b$$$ formed by elements at positions $$$2$$$, $$$3$$$ and $$$4$$$.

Sample Inputs:
5
3
2 1 5
2 2 4
2 2 3
2
2 1 2
1 2
4
3 1 2 4
2 2 4
4 1 2 5 6
2 2 5
5
3 3 1 2
3 2 5 3
5 7 2 3 1 4
5 1 2 6 3 5
3 2 6 3
2
1 1
1 2

Sample Outputs:
No
Yes
Yes
Yes
No

Solution (Python):
from collections import defaultdict
import sys
input = sys.stdin.readline
print = sys.stdout.write

def solve():
    d = defaultdict(int)
    A = []
    for _ in range(int(input())):
        a = [*map(int, input().split())][1:]
        A.append(a)
        for x in a:
            d[x] += 1
    for a in A:
        ok = True
        for x in a:
            if d[x] == 1:
                ok = False
                break
        if ok:
            return 'Yes'
    return 'No'
print('\n'.join((solve() for _ in range(int(input())))))

Solution (Python):
import sys
input = sys.stdin.readline
for _ in range(int(input())):
    n = int(input())
    d = {}
    l = []
    for i in range(n):
        a = list(map(int, input().split()))
        for j in a[1:]:
            if j in d.keys():
                d[j] += 1
            else:
                d[j] = 1
        l.append(a[1:])
    for i in l:
        flag = 0
        for j in i:
            if d[j] < 2:
                flag = 1
        if flag == 0:
            print('Yes')
            break
    else:
        print('No')

Solution (Python):
import sys, threading
input = sys.stdin.buffer.readline
from collections import deque, defaultdict

def solve(n, nums):
    mp = defaultdict(int)
    for l in nums:
        for i in range(len(l)):
            if i == 0:
                continue
            mp[l[i]] += 1
    for l in nums:
        flag = True
        for i in range(len(l)):
            if i == 0:
                continue
            if mp[l[i]] == 1:
                flag = False
        if flag:
            print('Yes')
            return
    print('No')

def main():
    for t in range(int(input())):
        nums = []
        n = int(input())
        for i in range(n):
            tmp = list(map(int, input().split()))
            nums.append(tmp)
        solve(n, nums)
threading.stack_size(2 * 10 ** 8)
t = threading.Thread(target=main)
t.start()
t.join()