typedef long long LL ;
const int maxn = 58 ;
typedef int Matrix[maxn][maxn] ;
Matrix A ;
vector<int> g[maxn] ;
int y[maxn] ;
void makeA(int n , int m){
memset(A , 0 , sizeof(A)) ;
for(int i = 0 ; i < m ; i++){
for(int j = 0 ; j < g[i].size() ; j++){
A[g[i][j]][i] = 1 ;
}
}
for(int i = 0 ; i < n ; i++) A[i][m] = y[i] ;
}
int Rank(int m , int n){
int i = 0 , j = 0 , k , r , u ;
while(i < m && j < n){
r = i ;
for(k = i ; k < m ; k++){
if(A[k][j]){
r = k ;
break ;
}
}
if(A[r][j]){
if(r != i){
for(k = 0 ; k <= n ; k++) swap(A[r][k] , A[i][k]) ;
}
for(u = i+1 ; u < m ; u++){
if(A[u][j]){
for(k = i ; k <= n ; k++) A[u][k] ^= A[i][k] ;
}
}
i++ ;
}
j++ ;
}
for(k = i ; k < m ; k++){
if(A[k][n]) return -1 ;
}
return i ;
}
int main(){
int t , i , k , x , q , n , m ;
cin>>t ;
for(int cas = 1 ; cas <= t ; cas++){
printf("Case %d:\n" , cas) ;
scanf("%d%d" , &n , &m) ;
for(i = 0 ; i < m ; i++){
g[i].clear() ;
scanf("%d" , &k) ;
while(k--){
scanf("%d" , &x) ;
g[i].push_back(x-1) ;
}
}
scanf("%d" , &q) ;
while(q--){
for(i = 0 ; i < n ; i++) scanf("%d" , &y[i]) ;
makeA(n , m) ;
int r = Rank(n , m) ;
if(r == -1) cout<< 0 << endl ;
else cout<< (1LL<<(m-r)) << endl ;
}
}
return 0 ;
}
HDU3364
最新推荐文章于 2020-12-07 15:17:30 发布