Advertisement
YEZAELP

SMMR-244: Pancake IoT

Jun 5th, 2021
993
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.92 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. using pi = pair <int, int>;
  5. using pii = pair <int, pi>;
  6. const int N = 1e2;
  7. int W, G, Q;
  8. string str;
  9. vector <int> Input, Output;
  10. bool TF[N+10];
  11. int Indeg[N+10], indeg[N+10];
  12.  
  13. struct Data{
  14.     string opr;
  15.     int a, b, c;
  16. };
  17.  
  18. Data ar[N+10];
  19. vector <int> g[N+10];
  20.  
  21. void Setting(){
  22.     for(int i=0;i<=N;i++) {
  23.         TF[i] = false;
  24.         indeg[i] = Indeg[i];
  25.     }
  26. }
  27.  
  28. void BFS(){
  29.     queue <int> q;
  30.     for(int i=0;i<W;i++) q.push(Input[i]);
  31.     while(!q.empty()){
  32.         int u = q.front();
  33.         q.pop();
  34.         for(auto v: g[u]){
  35.             indeg[v] --;
  36.             if(indeg[v] == 0){
  37.                 int a, b, c;
  38.                 a = ar[v].a;
  39.                 b = ar[v].b;
  40.                 c = ar[v].c;
  41.                 if(ar[v].opr == "AND")
  42.                     TF[v] = (TF[a] & TF[b]);
  43.                 else if(ar[v].opr == "OR")
  44.                     TF[v] = (TF[a] | TF[b]);
  45.                 else if(ar[v].opr == "XOR")
  46.                     TF[v] = (TF[a] ^ TF[b]);
  47.                 else if(ar[v].opr == "NOT")
  48.                     TF[v] = (!TF[a]);
  49.                 else if(ar[v].opr == "MUX"){
  50.                     if(TF[a] == 1) TF[v] = TF[c];
  51.                     else TF[v] = TF[b];
  52.                 }
  53.                 q.push(v);
  54.             }
  55.         }
  56.     }
  57. }
  58.  
  59. int main(){
  60.  
  61.     scanf("%d%d%d", &W, &G, &Q);
  62.  
  63.     for(int i=1;i<=W;i++){
  64.         int inp;
  65.         scanf("%d", &inp);
  66.         Input.push_back(inp);
  67.         cin >> str;
  68.     }
  69.  
  70.     for(int i=1;i<=G;i++){
  71.         int u;
  72.         scanf("%d", &u);
  73.         Output.push_back(u);
  74.         string opr;
  75.         cin >> opr;
  76.         int a = -1, b = -1, c = -1;
  77.         if(opr == "AND") {
  78.             Indeg[u] = 2;
  79.             scanf("%d%d", &a, &b);
  80.             g[a].push_back(u);
  81.             g[b].push_back(u);
  82.         }
  83.         else if(opr == "OR") {
  84.             Indeg[u] = 2;
  85.             scanf("%d%d", &a, &b);
  86.             g[a].push_back(u);
  87.             g[b].push_back(u);
  88.         }
  89.         else if(opr == "XOR") {
  90.             Indeg[u] = 2;
  91.             scanf("%d%d", &a, &b);
  92.             g[a].push_back(u);
  93.             g[b].push_back(u);
  94.         }
  95.         else if(opr == "NOT") {
  96.             Indeg[u] = 1;
  97.             scanf("%d", &a);
  98.             g[a].push_back(u);
  99.         }
  100.         else if(opr == "MUX") {
  101.             Indeg[u] = 3;
  102.             scanf("%d%d%d", &a, &b, &c);
  103.             g[a].push_back(u);
  104.             g[b].push_back(u);
  105.             g[c].push_back(u);
  106.         }
  107.         ar[u] = {opr, a, b, c};
  108.     }
  109.  
  110.     for(int i=1;i<=Q;i++){
  111.         Setting();
  112.         for(int j=0;j<W;j++){
  113.             int x;
  114.             scanf("%d", &x);
  115.             TF[ Input[j] ] = (x == 1);
  116.         }
  117.         BFS();
  118.         for(int j=0;j<G;j++){
  119.             if(TF[ Output[j] ]) printf("1 ");
  120.             else printf("0 ");
  121.         }
  122.         printf("\n");
  123.     }
  124.  
  125.     return 0;
  126. }
  127.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement