BZOJ1932——[Shoi2007]Setstack 集合堆栈机
1、题目大意:就是给你一个栈,有一些操作,向栈加入空集,把栈顶的元素复制一遍再加入栈,求栈顶两元素的并集,交集
还有栈的第一个元素和栈顶(将栈顶压缩成一个元素)
2、分析:这个其实不是用hash做的,是用系统地一堆函数做的。。
我用hash做的,其实就是暴力的hash,用ULL,用了一堆的STL。。。。不要去重,然后RKhash的长度记得取模
#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <vector> #include <stack> using namespace std; #define ULL unsigned long long #define ygorz pair<ULL, int> stack<vector<ygorz> > st; char str[20]; ygorz qaq[200000]; ULL power[200000]; int main() { int n; scanf("%d", &n); power[0] = 1; for (int i = 1; i <= 199900; i++) power[i] = power[i - 1] * 107; for (int i = 1; i <= n; i++) { scanf("%s", str); if (str[0] == 'P') { vector<ygorz> a; a.clear(); st.push(a); } else if (str[0] == 'D') { st.push(st.top()); } else if (str[0] == 'U') { vector<ygorz> a = st.top(); st.pop(); vector<ygorz> b = st.top(); st.pop(); int u = 0, v = 0; int wt = 0; while (u < a.size() || v < b.size()) { if (u == a.size()) { qaq[++wt] = b[v]; v++; } else if (v == b.size()) { qaq[++wt] = a[u]; u++; } else { if (a[u] < b[v]) { qaq[++wt] = a[u]; u++; } else if (a[u] > b[v]) { qaq[++wt] = b[v]; v++; } else { qaq[++wt] = a[u]; u++; v++; } } } vector<ygorz> c; if(wt){ c.clear(); for (int i = 1; i <= wt; i++){ c.push_back(qaq[i]); } } st.push(c); } else if (str[0] == 'I') { vector<ygorz> a = st.top(); st.pop(); vector<ygorz> b = st.top(); st.pop(); int u = 0, v = 0; /*for (; u < a.size(); u++) { for (; v < b.size()&&b[v] < a[u]; v++); if (v < b.size()&&a[u] == b[v]) c.push_back(a[u]); } */ int wt = 0; while (u < a.size() || v < b.size()) { if (u == a.size()) { // qaq[++wt] = b[v]; v++; } else if (v == b.size()) { // qaq[++wt] = a[u]; u++; } else { if (a[u] < b[v]) { // qaq[++wt] = a[u]; u++; } else if (a[u] > b[v]) { // qaq[++wt] = b[v]; v++; } else { qaq[++wt] = a[u]; u++; v++; } } } vector<ygorz> c; if(wt){ c.clear(); qaq[wt + 1].first = -1; for (int i = 1; i <= wt; i++){ c.push_back(qaq[i]); } } st.push(c); } else { ULL hash = 5; int ll = 2; vector<ygorz> a = st.top(); st.pop(); vector<ygorz> b = st.top(); st.pop(); for (int i = 0; i < a.size(); i++) { hash = hash * power[a[i].second] + a[i].first; ll += a[i].second; ll %= 199193; } hash = hash * power[a.size()] + 7; a.clear(); a.push_back(make_pair(hash, ll)); int u = 0, v = 0; int wt = 0; while (u < a.size() || v < b.size()) { if (u == a.size()) { qaq[++wt] = b[v]; v++; } else if (v == b.size()) { qaq[++wt] = a[u]; u++; } else { if (a[u] < b[v]) { qaq[++wt] = a[u]; u++; } else if (a[u] > b[v]) { qaq[++wt] = b[v]; v++; } else { qaq[++wt] = a[u]; u++; v++; } } } vector<ygorz> c; c.clear(); c.push_back(qaq[1]); for (int i = 2; i <= wt; i++){ c.push_back(qaq[i]); } st.push(c); } printf("%d\n", st.top().size()); } return 0; }
BZOJ1932——[Shoi2007]Setstack 集合堆栈机的更多相关文章
- BZOJ1932 [Shoi2007]Setstack 集合堆栈机
妈呀...clj大爷太强啦! 原来还有set_union和set_intersection这种东西... 于是只要把栈顶的每个元素hash一下记录到一个vector里去就好了 /*********** ...
- 2018.08.28 集合堆栈机(模拟+STL)
描述 中学数学里集合的元素往往是具体的数字,比如A = {1,2,3},B = {}(空集)等等.但是要特别注意,集合的元素也可以是另一个集合,比如说C = {{}},即说明C有且仅有一个元素--空集 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- [译]Python编写虚拟解释器
使用Python编写虚拟机解释器 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环 ...
- 零基础学Python--------第4章 序列的应用
第4章 序列的应用 4.1序列 序列是一块用于存放多个值的连续内存空间,并且按上一定顺序排列,每一个值(称为元素)都分配一个数字,称为索引或位置.通过该索引可以取出相应的值.例如,我们可以把一家酒店看 ...
- 【转】CLR和JIT的理解、.NET反汇编学习
CLR:通用语言运行时(Common Language Runtime)的简称,CLR是.NET框架的核心内容之一,可以把它看为一套标准资源,可以呗任何.NET程序使用.它包括:面向对象的编程模型.安 ...
- Atitit.虚拟机与指令系统的设计
Atitit.虚拟机与指令系统的设计 1. 两种计算模型 ,堆栈机和状态机(基于寄存器的虚拟机1 1.1.1. 堆栈机1 1.1.2. 状态机2 2. 为什么状态机比堆栈机快呢?3 2.1. Sta ...
- (Python编程)Pickle对象
Programming Python, 3rd Edition 翻译 最新版本见:http://wiki.woodpecker.org.cn/moin/PP3eD 19.4. Pickled Obje ...
- centos 7 搭建 LNMP ( Linux+Nginx+MySQL+PHP )
操作系统 | CentOS Linux release 7.6.1810 (Core) [root@localhost ~# cat /etc/redhat-release CentOS Linux ...
随机推荐
- c#.net WinForm 线程内 调用窗体控件
richTextBox1.BeginInvoke(new EventHandler(delegate { richTextBox1.AppendText("正在提交服务器..\r\n&quo ...
- 比较详细Python正则表达式操作指南(re使用)
比较详细Python正则表达式操作指南(re使用) Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式.Python 1.5之前版本则是通过 regex 模块提供 E ...
- Python基本运算符
Python基本运算符 什么是操作符? 简单的回答可以使用表达式4 + 5等于9,在这里4和5被称为操作数,+被称为操符. Python语言支持操作者有以下几种类型. 算术运算符 比较(即关系)运算符 ...
- 【经典】C++&RPG对战游戏
博文背景: 还记大二上学期的时候看的这个C++&RPG游戏(博主大一下学期自学的php,涵盖oop内容),一个外校的同学他们大一学的C++,大二初期C++实训要求做一个程序填空,就是这个 RP ...
- JS通过getBoundingClientRect获取的height可能与css设置的height不一致
发现如果DOM元素有padding-top或者padding-bottom值时, $(dom).height() = dom.style.display + padding-top + padding ...
- Install Mono and MonoDevelop on Fedora
http://www.mono-project.com/docs/getting-started/install/linux/ http://www.monodevelop.com/download/ ...
- ecshop Admin后台删除(Ajxa删除,无跳转连接)
关联文件Admin/goods.php?act=trash, Admin/js/listtable.js html代码 <a href="javascript:;" ...
- C#如何把List of Object转换成List of T具体类型
上周码程序的时候碰到个问题,因为设计上的约束,一个方法接受的参数只能为List<object>类型,然而该方法需要处理的真实数据则是确定的List<Currency>.然而C# ...
- Logback LogBack
1.简介 LogBack是一个日志框架,它与Log4j可以说是同出一源,都出自Ceki Gülcü之手.(log4j的原型是早前由Ceki Gülcü贡献给Apache基金会的) 1.1 LogBac ...
- IIS 8.5 伪静态去掉index.php thinkphp 3.2.2
因为测试都是在win下开发的 win8.1企业版 II8.5 首先安装 Thinkphp 3.2.2 URL Rewrite Module 2.0 http://www.iis.net/downlo ...