本题主要考察 有向图是否存在环路,记忆化搜索,状态压缩存储。

#include <bits/stdc++.h>
//#include <iostream>
//#include <queue>
//#include <string>using namespace std;
int Q, M, N, S;using ll = long long;// 状态压缩
ll input[10005][40];short output[505];bool hasloop;struct node {int op = 0; // 0 not, 1 and, 2 or, 3 xor, 4 nand, 5 norint from[7]; // 如果从器件得到是整数,如果是从 input 得到是负数
}elem[505];int res[505]; // 运算结果, 如果结果未初始化是 0,初始化了是 1/-1void mset(int t, int i) {int index = i / 64;int loc = i % 64;input[t][index] |= (1 << loc);
}int read(int t, int i) {--i;int index = i / 64;int loc = i % 64;return (input[t][index] >> loc) & 0x1;
}bool vis[505];
void test() {memset(vis, 0, sizeof(vis));hasloop = false;for (int i = 1; i <= N; ++i) {if (vis[i]) continue;queue<int> q;q.push(i);int mvis[505];memset(mvis, 0, sizeof(mvis));mvis[i] = true;while(!q.empty()) {int f = q.front(); q.pop();for (int j = 0; j < 5; ++j) {if (elem[f].from[j] == 0) break;if (elem[f].from[j] > 0) {int to  = elem[f].from[j];if (mvis[to]) {hasloop = true;return;}if (vis[to]) continue;vis[to] = mvis[to] = true;q.push(to);}}}}
}int getRes(int no, int t) {//    cout << "no = " << no << ", op = " << elem[no].op << endl << "input: " << endl;
//    for (int i = 0; i < 5; ++i) {//        cout << elem[no].from[i] << ", ";
//    }
//    cout << endl;if (res[no] != 0) return res[no] == 1 ? 1 : 0;int fv[5];memset(fv, 0, sizeof(fv));int cnt = 0;for (int i = 0; i < 5; ++i) {if (elem[no].from[i] == 0) break;if (elem[no].from[i] < 0) {fv[i] = read(t, -elem[no].from[i]);} else {fv[i] = getRes(elem[no].from[i], t);}cnt++;}int v = fv[0];switch (elem[no].op) {case 0:v = !v; break;case 1:while (--cnt) {v &= fv[cnt];}break;case 2:while (--cnt) {v |= fv[cnt];}break;case 3:while (--cnt) {v ^= fv[cnt];}break;case 4:while (--cnt) {v &= fv[cnt];}v = !v;break;case 5:while (--cnt) {v |= fv[cnt];}v = !v;break;} // end switchif (v == 0) res[no] = -1;else res[no] = 1;
//    cout << "no = " << no  << ", res = " << res[no] << endl;return v;
}void solve() {cin >> M >> N;memset(elem, 0, sizeof(elem));for (int i = 1; i <= N; ++i) {string func;int k;string op;cin >> func >> k;if (func == "AND") elem[i].op = 1;else if (func == "OR") elem[i].op = 2;else if (func == "XOR") elem[i].op = 3;else if (func == "NAND") elem[i].op = 4;else if (func == "NOR") elem[i].op = 5;for (int j = 0; j < k; ++j) {cin >> op;int t = atoi(op.substr(1).c_str());if (op[0] == 'I') {elem[i].from[j] = -t;} else {elem[i].from[j] = t;}}}// part 2memset(input, 0, sizeof(input));cin >> S;for (int i = 0; i < S; ++i) {int bit;for (int j = 0; j < M; ++j) {cin >> bit;if (bit) {mset(i, j);}}}// 测试是否有环test();if (hasloop) {cout << "LOOP" << endl;}for (int t = 0; t < S; ++t) {int s;cin >> s;for (int j = 0; j < s; ++j) {cin >> output[j];}if (!hasloop) {memset(res, 0, sizeof(res));for (int j = 0; j < s; ++j) {cout << getRes(output[j], t) << " ";}cout << endl;}
//        cout << "debug::" << endl;
//        for (int k = 1; k <= N; ++k) {//            cout << getRes(k, t) << " ";
//        }
//        cout << endl << endl;}
}int main() {cin >> Q;while(Q--) solve();return 0;
}

CCF CSP 202009-3 点亮数字人生相关推荐

  1. 第 20 次 CSP认证 202009-3 点亮数字人生

    样例一输入: 1 3 5 XOR 2 I1 I2 XOR 2 O1 I3 AND 2 O1 I3 AND 2 I1 I2 OR 2 O3 O4 4 0 1 1 1 0 1 1 1 1 0 0 0 2 ...

  2. CCF CSP 点亮数字人生(记忆化搜索+拓扑排序判环)

    题目背景 土豪大学的计算机系开了一门数字逻辑电路课,第一个实验叫做"点亮数字人生",要用最基础的逻辑元件组装出实际可用的电路.时间已经是深夜了,尽管实验箱上密密麻麻的连线已经拆装了 ...

  3. CCF CSP认证历年真题 满分代码(持续更新中)

    目标 在接下来的半年到一年时间内,补全CCF认证历年真题(A-D)的满分代码(E题随缘). 考虑到CCF认证这个东西是可以混分的,我计划对D.E题额外增加部分分代码,或许有助于不同层次的选手备赛. 除 ...

  4. CCF CSP认证考试题解目录

    由于本人的书籍<算法详解(C++11 语言描述)>已经出版,为了降低题解的维护难度,有关CCF CSP考试的所有题解的更新将全部在书籍的配套仓库进行,CSDN博客中不再进行任何题解的更新. ...

  5. CCF CSP 201812-2 小明放学 解题思路及经验总结

    更新:多谢weixin_44714465同学指出我的错误[详见49-52行代码,已改正!].CCF CSP的OJ居然没有把这个错误检测出来,不过为了追求严谨,我们还是应该及时改正! 题目描述 试题编号 ...

  6. CCF CSP认证菜鸟刷题日志

    CCF CSP菜鸟刷题日志(c/c++) 本萌新写给自己看的,要是有大佬路过,请多多指教orz 立个flag:每日一更,至201903 9月15ccf csp,冲鸭! 今天(2019.8.18)起每天 ...

  7. CCF CSP 201609-2 火车购票

    题目链接:http://118.190.20.162/view.page?gpid=T46 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排 ...

  8. 计算机能力挑战赛_蓝桥杯、PAT、CCF CSP、团体程序设计天梯赛、传智杯、计算机能力挑战赛、软考等大学生编程比赛/考试介绍...

    介绍7个适合普通大学生参加的编程比赛/考试(注:有的比赛如蓝桥杯有多种赛别,本文仅介绍其中的程序设计/编程比赛). 编程入门书籍推荐<算法笔记>,内容详细易懂,对新手非常友好,描述语言为C ...

  9. 以CCF CSP认证为抓手,积极探索软件基础能力递进式培养体系

    原文链接:以CCF CSP认证为抓手,积极探索软件基础能力递进式培养体系 发布单位:学会      发布时间:2017-01-20 16:16 作者:陆建峰    余立功 摘要:为提升计算机专业类学生 ...

  10. ccf csp寻宝!大冒险!(C语言)

    ccf csp寻宝!大冒险! 题目背景 暑假要到了.可惜由于种种原因,小 P 原本的出游计划取消.失望的小 P 只能留在西西艾弗岛上度过一个略显单调的假期--直到-- 某天,小 P 获得了一张神秘的藏 ...

最新文章

  1. linux 设备树调试必须知道的几个路径
  2. php 5.2 mysqli_PHP5安装好后添加mysqli扩展支持 | 学步园
  3. node windows更新_node.js 01 简介 - 产生,发展历程,优势,适用场景,实际应用
  4. LVS负载均衡:三种工作模式、十种调度算法
  5. 【数学基础】概率论——p(x|\theta)和p(x;\theta)的区别
  6. 浅谈离线化方案的探索,跨容器
  7. 空军军医大学计算机复试线,2021空军军医大学考研国家线公布时间_国家线是多少分...
  8. 运用hanlp 通过 python 结合jpype 导出依存句法可视化
  9. Java笔记1(2015-8-30)
  10. word转PDF时,英文单词的字母间距问题
  11. 微信小程序赞赏功能,非微信赞赏功能
  12. 联想ghost重装系统_联想笔记本重装系统图文教程
  13. spring boot启动报错: The APR based Apache Tomcat Native library which allows optimal performance
  14. 【渝粤教育】国家开放大学2018年秋季 1318T社会统计学 参考试题
  15. bzoj 4805: 欧拉函数求和
  16. IDEA 数组遍历快捷键
  17. 2013应届毕业生各大IT公司待遇整理汇总篇(转)
  18. 【CVPR 2021】Knowledge Review:知识蒸馏新解法
  19. 设计误区之一-正无穷
  20. hbck源码系列(四)--表的完整性检查和修复Check

热门文章

  1. WinRAR的注册破解
  2. 中国机床行业投资现状与十四五发展战略决策报告2022版
  3. 深度图像确定目标距离_技术交流一种距离选通水下激光成像系统设计与实验研究...
  4. linux xp双系统引导修复工具,XP和Linux双系统启动菜单的修复
  5. iOS 封装Healthkit
  6. java xml解析框架_JAVA解析xml的五种方式对比
  7. sql 2008 R2 备份和还原
  8. 绕过图片打印成PDF时出现锯齿的问题
  9. 频谱、幅度谱、功率谱和能量谱
  10. 快速排序C语言递归代码实现