func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 1005;   const int mod1 = 998244353;   const int mod2 = 1e9 + 7;   const int b1 = 337;   const int b2 = 421;   const int inf = 2147483647;   struct Pair {     int x[2] = {};     bool operator<(const Pair a) const {       return x[0] < a.x[0] || x[0] == a.x[0] && x[1] < a.x[1];     }   };   struct BitSet {     unsigned long long b[16] = {};     inline void reset() { memset(b, 0, sizeof(b)); }     inline void set(int x) { b[x / 64] |= (1ull << (x % 64)); }     inline void operator^=(const BitSet &a) {       for (int i = 0; i < 16; ++i) b[i] ^= a.b[i];     }     inline Pair getHashVal() {       Pair ans;       for (int i = 0; i < 16; ++i) {         ans.x[0] = (1ll * ans.x[0] * b1 % mod1 + b[i] % mod1) % mod1;         ans.x[1] = (1ll * ans.x[1] * b2 % mod2 + b[i] % mod2) % mod2;       }       return ans;     }   };   int n, s, d;   BitSet bs[31], sta[1 << 20], cur;   int cnt[1 << 20], m;   map<Pair, int> mp;   void init() {     m = min(s, 20);     for (int i = 0; i < m; ++i) {       cnt[1 << i] = 1;       sta[1 << i] = bs[i];     }     for (int i = 0; i < (1 << m); ++i) {       if (i != (i & -i)) {         cnt[i] = cnt[i - (i & -i)] + 1;         sta[i] = sta[i - (i & -i)];         sta[i] ^= sta[i & -i];       }       Pair x = sta[i].getHashVal();       if (!mp.count(x) || mp[x] > cnt[i]) {         mp[x] = cnt[i];       }     }     for (int i = 0; i < (s - m); ++i) {       sta[1 << i] = bs[i + m];     }     for (int i = 1; i < (1 << (s - m)); ++i) {       if (i == (i & -i)) continue;       sta[i] = sta[i - (i & -i)];       sta[i] ^= sta[i & -i];     }   }   int getans() {     BitSet now;     int ans = inf;     for (int i = 0; i < (1 << (s - m)); ++i) {       if (cnt[i] >= ans) continue;       now = cur, now ^= sta[i];       Pair x = now.getHashVal();       if (mp.count(x) && mp[x] + cnt[i] < ans) {         ans = mp[x] + cnt[i];       }     }     return ans == inf ? -1 : ans;   }   int main() {     scanf( %d%d%d , &n, &s, &d);     for (int i = 0; i < s; ++i) {       int c;       scanf( %d , &c);       for (int j = 0; j < c; ++j) {         int u;         scanf( %d , &u);         u--;         bs[i].set(u);       }     }     init();     vector<int> ans;     for (int i = 0; i < d; ++i) {       int t;       scanf( %d , &t);       cur.reset();       while (t--) {         int u;         scanf( %d , &u);         u--;         cur.set(u);       }       ans.push_back(getans());     }     for (int i = 0; i < ans.size(); ++i) printf( %d n , ans[i]);     puts(  );   }   