题意
思路
这个题其实刚开始用的爆搜,结果真就爆了,其实很简单,先让这个矩阵的第一列相互异或,如果最后结果不为0那么就直接输出就可以了。
如果是0
那么就从最后一排开始找,如果结果不为0,那么就直接输出。
如果整个矩阵都遍历了一遍还是没找出来,那么就只有一种可能性,就是这个矩阵的每一排的数字都是相等的,那么我们也没有任何找的必要性了,(因为无论怎么找都是0).
那么就按照相应的那么输出就可以了
#include<iostream>
using namespace std;
int dp[2100][2100];
int main(){
int a,b;
cin>>a>>b;
for(int i=1;i<=a;i++)
for(int j=1;j<=b;j++)cin>>dp[i][j];
int p=(1<<10)-1;
int ans=dp[1][1];
for(int i=2;i<=a;i++)ans^=dp[i][1];
//cout<<ans<<endl;
if(ans!=0){
cout<<"TAK"<<endl;
for(int i=1;i<=a;i++)cout<<"1 ";
cout<<endl;
}else {
int x,y;
int res=0;
for(int i=a;i;i--){
res=0;
for(int j=2;j<=b;j++){
res=dp[i][1]&p;
res^=dp[i][j];
if(res){
x=i,y=j;
break;
}
}
if(res)break;
}
if(res){
cout<<"TAK"<<endl;
for(int i=1;i<=a;i++){
if(i==x){
cout<<y<<" ";
}else cout<<"1 ";
}
cout<<endl;
}else cout<<"NIE"<<endl;
}
}