HDU3364

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 ;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值