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 集合堆栈机的更多相关文章

  1. BZOJ1932 [Shoi2007]Setstack 集合堆栈机

    妈呀...clj大爷太强啦! 原来还有set_union和set_intersection这种东西... 于是只要把栈顶的每个元素hash一下记录到一个vector里去就好了 /*********** ...

  2. 2018.08.28 集合堆栈机(模拟+STL)

    描述 中学数学里集合的元素往往是具体的数字,比如A = {1,2,3},B = {}(空集)等等.但是要特别注意,集合的元素也可以是另一个集合,比如说C = {{}},即说明C有且仅有一个元素--空集 ...

  3. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  4. [译]Python编写虚拟解释器

    使用Python编写虚拟机解释器 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环 ...

  5. 零基础学Python--------第4章 序列的应用

    第4章 序列的应用 4.1序列 序列是一块用于存放多个值的连续内存空间,并且按上一定顺序排列,每一个值(称为元素)都分配一个数字,称为索引或位置.通过该索引可以取出相应的值.例如,我们可以把一家酒店看 ...

  6. 【转】CLR和JIT的理解、.NET反汇编学习

    CLR:通用语言运行时(Common Language Runtime)的简称,CLR是.NET框架的核心内容之一,可以把它看为一套标准资源,可以呗任何.NET程序使用.它包括:面向对象的编程模型.安 ...

  7. Atitit.虚拟机与指令系统的设计

    Atitit.虚拟机与指令系统的设计 1. 两种计算模型  ,堆栈机和状态机(基于寄存器的虚拟机1 1.1.1. 堆栈机1 1.1.2. 状态机2 2. 为什么状态机比堆栈机快呢?3 2.1. Sta ...

  8. (Python编程)Pickle对象

    Programming Python, 3rd Edition 翻译 最新版本见:http://wiki.woodpecker.org.cn/moin/PP3eD 19.4. Pickled Obje ...

  9. centos 7 搭建 LNMP ( Linux+Nginx+MySQL+PHP )

    操作系统 | CentOS Linux release 7.6.1810 (Core) [root@localhost ~# cat /etc/redhat-release CentOS Linux ...

随机推荐

  1. Struts2-----面试题汇总

    1.struts2框架中,从用户发出请求到获得响应整个过程的流转图 FilterDispatcher --> ActionProxy-->Configuration Manager--&g ...

  2. CSS3-canvas绘制线性渐变

    <!doctype html><html><head><meta charset="utf-8"><title>canv ...

  3. elasticsearch scroll api--jestclient invoke

    @Test public void testScroll(){ JestClientFactory factory = new JestClientFactory(); factory.setHttp ...

  4. PHP_php.ini_说明详解

    这个文件必须命名为''php.ini''并放置在httpd.conf中的PHPIniDir指令指定的目录中.最新版本的php.ini可以在下面两个位置查看:http://cvs.php.net/vie ...

  5. 英文论文中i.e.,e.g.,etc.,viz.的简要小结

    英文论文中i.e.,e.g.,etc.,viz.的简要小结 看了一堆用法,全白扯,自己总结的最好记,最实用 i.e. =即.换句话说.也就是说."'In essence' or 'in ot ...

  6. python线程锁

    import time,threading balance = 0 lock = threading.Lock() def change_it(n): global balance balance = ...

  7. mac pro在公司连WiFi正常,回家回宿舍就找不到WiFI信号,需要重启才能找到WiFI热点

    解决办法:修改路由器的频段到1-11这个范围. 之前一直没时间去找原因,项目也急,这几天项目不是特别急了,就找找了,原因. 因为之前还是好好的,主要是之前有次修改了下路由器的配置. 改了下默认的发送频 ...

  8. CMake安装(linux)

    环境:CentOS6.5 1.下载网址: http://www.cmake.org/download/ (选择linux版本,编译安装) 2.安装 # tar zxvf cmake-.tar.gz # ...

  9. Linux启动盘制作

    1.下载Universal-USB-Installer软件,在电脑上插入空U盘,打开软件,依下列所示步骤进行 2.点击同意 3.点击版本选择框,会出现它支持的系统镜像文件的版本,包括win7.win8 ...

  10. php引入lucene方法

    在引入Lucene之前,先说下PHP JAVA Bridge的概念: PHP JAVA Bridge:就是在PHP和Java之间搭建一座桥梁,利用这座桥梁在这两个实体之间建立起一个沟通渠道,在这座桥梁 ...