theme:给定n*m的矩阵,问能否从每行中选出一个数求出这n个数的抑或和>0,输出。1≤n,m≤500
solution:抑或和只会>=0,只有两个数相同时才会抑或为0,所以我们可以就先取每行第一个数进行抑或,若抑或和不为0,则直接输出,否则说明任n-1个数抑或后与剩下那个数相同,我们可以遍历每一行,只要找到一个数与该行第一个元素不同,就可以用这个数代替第一个元素,与剩下每行的第一个元素抑或结果一定不为0,若找不到,则说明没有。
#include<bits/stdc++.h> using namespace std; #define far(i,t,n) for(int i=t;i<n;++i) #define endl "\n" #define spa " " typedef long long ll; typedef unsigned long long ull; using namespace std; int a[550][550]; int main() { int n,m; cin>>n>>m; far(i,0,n) far(j,0,m) scanf("%d",&a[i][j]); int ans=0; far(i,0,n) ans^=a[i][0]; if(ans) { cout<<"TAK\n"; far(i,0,n) cout<<1<<" "; cout<<endl; return 0; } far(i,0,n) { far(j,1,m) if(a[i][j]!=a[i][0]) { cout<<"TAK\n"; far(k,0,i) cout<<1<<" "; cout<<j+1<<" "; far(k,i+1,n) cout<<1<<" "; cout<<endl; return 0; } } cout<<"NIE\n"; }