题目链接:点击这里
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
char s[30];
int (*ans[10005])(int , int);
int st[10005];
int NOT(int x, int y){
return !y;}
int AND(int x, int y){
return x & y;}
int OR(int x, int y){
return x | y;}
int XOR(int x, int y){
return x ^ y;}
int NAND(int x, int y){
return !((!x) & y);}
int NOR(int x, int y){
return !((!x) | y);}
int in[10005];
struct node{
int to,next;
}kkk[50005],vis[20005];
int head[50005];
int res[50005];
int num_edge=0;
vector<int>top;
int jin[10005][1005];
void init(){
num_edge=0;
memset(st,0,sizeof(st));
memset(head,0,sizeof(head));
memset(in,0,sizeof(in));
top.clear();
}
void addedge(int u,int v){
kkk[++num_edge].to=v;
kkk[num_edge].next=head[u];
head[u]=num_edge;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
init();
int n,m;
scanf("%d%d",&m,&n);
for(int i=1;i<=n;++i){
int x;
scanf("%s%d",s,&x);
in[i]=x;
if(!strcmp(s,"XOR")) ans[i]=XOR,st[i]=0;
else if(!strcmp(s,"AND")) ans[i]=AND,st[i]=1;
else if(!strcmp(s,"OR")) ans[i]=OR,st[i]=0;
else if(!strcmp(s,"NOT")) ans[i]=NOT,st[i]=1;
else if(!strcmp(s,"NAND")) ans[i]=NAND,st[i]=0;
else ans[i]=NOR,st[i]=1;
char c;int y;
for(int j=1;j<=x;++j){
scanf(" %c%d",&c,&y);
if(c=='I') addedge(y + n, i);
else addedge(y, i);
}
}
queue<int>q;
for(int i=n+1;i<=n+m;++i){
q.push(i);
top.push_back(i);//记录拓扑顺序
}
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=kkk[i].next){
if(!--in[kkk[i].to]){
q.push(kkk[i].to);
int v=kkk[i].to;
top.push_back(v);
}
}
}
if(top.size()<n){
printf("LOOP\n");
int ii,tp;
scanf("%d", &ii);
for(int i = 1; i <= ii; ++i)
for(int j = 1; j <= m; ++j)
scanf("%d",&tp);
for(int i = 1; i <= ii; ++i) {
int uu;
scanf("%d", &uu);
for(int i = 1; i <= uu; ++i)
scanf("%d",&tp);
}
continue;
}
int ii;scanf("%d",&ii);
for(int i=1;i<=ii;++i){
for(int j=n+1;j<=n+m;++j){
scanf("%d",&res[j]);
}
for(int j=1;j<=n;++j){
res[j]=st[j];
}
for(int j=0;j<top.size();++j){
int u=top[j];
for(int hy=head[u];hy;hy=kkk[hy].next){
res[kkk[hy].to]=ans[kkk[hy].to](res[kkk[hy].to],res[u]);
}
}
for(int j=1;j<=n;++j){
jin[i][j]=res[j];
}
}
for(int i=1;i<=ii;++i){
int hhh;
scanf("%d",&hhh);
for(int j=1;j<=hhh;++j){
int tpp;
scanf("%d", &tpp);
printf("%d ",jin[i][tpp]);
}
printf("\n");
}
}
return 0;
}