【!!最近写了好多C题,打算先放代码供大家参考,之后再补充题解!!】
题目大意
考点
思路
易错点
收获
满分代码
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+10,S=1e4+10;
#define fi first
#define se second
#define pb push_back
typedef pair<int,int> PII;
typedef struct Node{
int no,typ;
}node;
int n,m,q,s,to_ori_no[N],deg[N],st[N],idx;
vector<int> h[N],revh[N];
node a[N];
void ini(){
for(int i=1;i<=n;i++)deg[i]=0;
for(int i=1;i<=n;i++)h[i].clear();
for(int i=1;i<=n;i++)revh[i].clear();
for(int i=1;i<=n;i++)to_ori_no[i]=0;
for(int i=1;i<=n;i++)st[i]=0;
idx=0;
}
int get_num(string s){
int res=0;
for(int i=0;i<s.length();i++){
res*=10;
res+=s[i]-'0';
}
return res;
}
int trans(string op){
if(op=="NOT")return 0;
else if(op=="AND")return 1;
else if(op=="OR")return 2;
else if(op=="XOR")return 3;
else if(op=="NAND")return 4;
else if(op=="NOR")return 5;
}
int main(){
cin>>q;
while(q--){
cin>>m>>n;
ini();
node tmp[N];
bool curr_flag;
for(int i=1;i<=n;i++){
string op;
int k;
cin>>op;
tmp[i].no=i;
tmp[i].typ=trans(op);
cin>>k;
for(int j=0;j<k;j++){
cin>>op;
int x=get_num(op.substr(1));
if(op[0]=='I'){
h[i].pb(x+n);
}
else{
deg[i]++;
h[i].pb(x);
revh[x].pb(i);
}
}
}
queue<int>q;
for(int i=1;i<=n;i++){
if(deg[i]==0 && st[i]==0){
q.push(i);
to_ori_no[i]=++idx;
a[idx]=tmp[i];
}
}
while(!q.empty()){
int cur=q.front(); q.pop();
for(int j:revh[cur]){
deg[j]--;
if(deg[j]==0){
q.push(j);
to_ori_no[j]=++idx;
a[idx]=tmp[j];
}
}
}
curr_flag=(idx==n);
cin>>s;
vector<bitset<S>> input(m+5);
for(int i=0;i<s;i++){
for(int j=1;j<=m;j++){
int x;
cin>>x;
if(x)input[j].set(i);
}
}
vector<bitset<S>> ans(n+5);
for(int i=1;i<=n;i++){
bitset<S> res;
int cnt=0;
int opr=a[i].typ;
for(int j:h[a[i].no]){
bitset<S>op;
if(j>n)op=input[j-n];
else op=ans[to_ori_no[j]];
if(opr==0){
op.flip();
res=op;
}
else if(opr==1 || opr==4){
if(!cnt)res=op;
else res&=op;
}
else if(opr==2 || opr==5){
if(!cnt)res=op;
else res|=op;
}
else{
if(!cnt)res=op;
else res^=op;
}
cnt++;
}
if(opr>3)res.flip();
ans[i]=res;
}
for(int i=0;i<s;i++){
int cnt;
cin>>cnt;
for(int j=0;j<cnt;j++){
int x;
cin>>x;
if(curr_flag)cout<<ans[to_ori_no[x]][i]<<" ";
}
if(curr_flag)cout<<endl;
}
if(!curr_flag)cout<<"LOOP\n";
}
return 0;
}