Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- using pi = pair <int, int>;
- using pii = pair <int, pi>;
- const int N = 1e2;
- int W, G, Q;
- string str;
- vector <int> Input, Output;
- bool TF[N+10];
- int Indeg[N+10], indeg[N+10];
- struct Data{
- string opr;
- int a, b, c;
- };
- Data ar[N+10];
- vector <int> g[N+10];
- void Setting(){
- for(int i=0;i<=N;i++) {
- TF[i] = false;
- indeg[i] = Indeg[i];
- }
- }
- void BFS(){
- queue <int> q;
- for(int i=0;i<W;i++) q.push(Input[i]);
- while(!q.empty()){
- int u = q.front();
- q.pop();
- for(auto v: g[u]){
- indeg[v] --;
- if(indeg[v] == 0){
- int a, b, c;
- a = ar[v].a;
- b = ar[v].b;
- c = ar[v].c;
- if(ar[v].opr == "AND")
- TF[v] = (TF[a] & TF[b]);
- else if(ar[v].opr == "OR")
- TF[v] = (TF[a] | TF[b]);
- else if(ar[v].opr == "XOR")
- TF[v] = (TF[a] ^ TF[b]);
- else if(ar[v].opr == "NOT")
- TF[v] = (!TF[a]);
- else if(ar[v].opr == "MUX"){
- if(TF[a] == 1) TF[v] = TF[c];
- else TF[v] = TF[b];
- }
- q.push(v);
- }
- }
- }
- }
- int main(){
- scanf("%d%d%d", &W, &G, &Q);
- for(int i=1;i<=W;i++){
- int inp;
- scanf("%d", &inp);
- Input.push_back(inp);
- cin >> str;
- }
- for(int i=1;i<=G;i++){
- int u;
- scanf("%d", &u);
- Output.push_back(u);
- string opr;
- cin >> opr;
- int a = -1, b = -1, c = -1;
- if(opr == "AND") {
- Indeg[u] = 2;
- scanf("%d%d", &a, &b);
- g[a].push_back(u);
- g[b].push_back(u);
- }
- else if(opr == "OR") {
- Indeg[u] = 2;
- scanf("%d%d", &a, &b);
- g[a].push_back(u);
- g[b].push_back(u);
- }
- else if(opr == "XOR") {
- Indeg[u] = 2;
- scanf("%d%d", &a, &b);
- g[a].push_back(u);
- g[b].push_back(u);
- }
- else if(opr == "NOT") {
- Indeg[u] = 1;
- scanf("%d", &a);
- g[a].push_back(u);
- }
- else if(opr == "MUX") {
- Indeg[u] = 3;
- scanf("%d%d%d", &a, &b, &c);
- g[a].push_back(u);
- g[b].push_back(u);
- g[c].push_back(u);
- }
- ar[u] = {opr, a, b, c};
- }
- for(int i=1;i<=Q;i++){
- Setting();
- for(int j=0;j<W;j++){
- int x;
- scanf("%d", &x);
- TF[ Input[j] ] = (x == 1);
- }
- BFS();
- for(int j=0;j<G;j++){
- if(TF[ Output[j] ]) printf("1 ");
- else printf("0 ");
- }
- printf("\n");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement