题目传送门
从矩阵中每一行中选一个数,确定这些数XOR严格大于零
纯暴力的DP,没什么优美可言,因为列的选取没有限制,所以在当前行pos任选一个位置,与所有上一行pos-1中,可以存在XOR值异或就可以了。最后判断除零以外,是否有其他的值存在。
此外,因为要输出顺序,所以再开一个数组,记录在行pos上,到达值i时,加入的列,再根据异或的自反性 a XOR a =0,倒退回去即可。
#include <stdio.h>
#include <climits>
#include <cstring>
#include <time.h>
#include <math.h>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <utility>
#include <vector>
#include <string>
#define INF 0x3f3f3f3f
#define ll long long
#define Pair pair<int,int>
#define re return
#define getLen(name,index) name[index].size()
#define mem(a,b) memset(a,b,sizeof(a))
#define Make(a,b) make_pair(a,b)
#define Push(num) push_back(num)
#define rep(index,star,finish) for(register int index=star;index<finish;index++)
#define drep(index,finish,star) for(register int index=finish;index>=star;index--)
using namespace std;
int N,M;
int store[505][505];
bool dp[500][1050];
int pre[500][1050];
vector<int> ans;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
int kind=0;
cin>>N>>M;
rep(i,0,N){
rep(j,0,M){
cin>>store[i][j];
}
}
rep(i,0,M){
dp[0][store[0][i]]=true;
pre[0][store[0][i]]=i;
}
rep(i,1,N){
rep(j,0,M){
int num=store[i][j];
rep(k,0,1024){
if(dp[i-1][k]){
pre[i][k^num]=j;
dp[i][k^num]=true;
}
}
}
}
bool f=false;
rep(i,1,1024){
if(dp[N-1][i]){
f=true;
int num=i;
drep(pos,N-1,0){
ans.Push(pre[pos][num]);
num=num ^ store[pos][pre[pos][num]];
}
break;
}
}
if(!f){
cout<<"NIE"<<endl;
}else{
cout<<"TAK"<<endl;
drep(i,ans.size()-1,0)
cout<<ans[i]+1<<" ";
cout<<endl;
}
re 0;
}