题意:
给出一个矩阵n(<=500)*m(<=500)每一行任选一个数 异或在一起 求一个 异或在一起不为0 的每行的取值列号
思路: 异或的性质 交换律 x1^x2^x3==x3^x2^x1 可以任意换位置 并且 x1^x2==x3^x4 等于 x1^x2^x3==x4 可以任意换位置
所以等于零时有 x1^x2^x3^x4==0 (x1^x2)^(x3^x4)==0 x1^x2==x3^x4 都可以任意结合
所以本题只要任意选择列 如果为0 就每一列 找与已选择的列不一样的即可 如果找不到就输出-1
#include<bits/stdc++.h>
#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;i++)
#define MS(arr,arr_value) memset(arr,arr_value,sizeof(arr))
#define F first
#define S second
#define pii pair<int ,int >
#define mkp make_pair
#define pb push_back
#define arr(zzz) array<ll,zzz>
using namespace std;
#define ll long long
const int maxn=5e2+;
int a[maxn][maxn];
const int inf=0x3f3f3f3f;
int main(){
int n,m;
scanf("%d%d",&n,&m);
int now=;
for(int i=;i<n;i++){
for(int j=;j<m;j++){
scanf("%d",&a[i][j]);
}
}
for(int i=;i<n;i++)now^=a[i][];
if(now!=){
cout<<"TAK\n";
for(int i=;i<n;i++)cout<<<<" ";
return ;
}
else {
for(int i=;i<n;i++){
for(int j=;j<m;j++){
if(a[i][j]!=a[i][]){
cout<<"TAK\n";
for(int k=;k<n;k++){
if(k!=i)cout<<<<" ";
else cout<<j+<<" ";
}
return ; }
}
}
cout<<"NIE\n"; }
return ;
}