2020.9CSP 点亮数字人生

题目链接:点击这里

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_45695839/article/details/111320876
CSP
今日推荐