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 ...
随机推荐
- Blast本地化
转载]Blast本地化:使用Blastall进行数据库比对 (2012-02-13 21:25:31) 用blastall进行序列比对 blastall是最常用的blast程序之一,其功能非常强大 ...
- PHP 数组(遍历)
数组定义$attr = array(); //定义一个空的数组$attr = array(1,2,3,4); //定义一个有值的数组$attr[0]="aa";$attr[1]=& ...
- 【浅谈html5 响应式布局之自动适应屏幕宽度】
允许网页宽度自动调整 “自适应网页设计”到底是怎么做到的?其实并不难. 首先,在网页代码的头部,加入一行viewport元标签. <meta name=”viewport” content=”w ...
- Java——URLEncoder和URLDecoder
import java.net.URLDecoder; import java.net.URLEncoder; //========================================== ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【四】——实现模型工厂,依赖注入以及格式配置
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在上一篇中,我们已经初步开始使用Web Api了,但同时出现了一些很多不足之处,本章我们就着 ...
- 入门:JavaWeb Cookie
总结: JavaWeb 利用Cookie 存储在本地用户名和密码,设置Cookie的生存时间. 两个页面,一个登陆页面,一个登陆后的页面,在登陆页面选择是否保存Cookie(保存Cookie,下次自动 ...
- 关于Unity动态物体无法向使用使用custom shader和lightmap的物体投射阴影
最近在做unity shader forge和marmoset的优化,TA那边遇到了一个阴影显示的问题,具体如下: 在Forward Rendering状态下,静态场景使用了是shader for ...
- live555库中的openRTSP实例
一.openRTSP编译运行 a)windows下编译运行 还是以mediaServer作为服务端,openRTSP作为客户端 b)Linux下编译运行 转自http://kuafu80.blog.1 ...
- xss利用和检测平台
xssing 是安全研究者Yaseng发起的一个基于 php+mysql的 网站 xss 利用与检测开源项目,可以对你的产品进行黑盒xss安全测试,可以兼容获取各种浏览器客户端的网站url,cooki ...
- Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)(转)
我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_ ...