维护一个01序列,一共四种操作:

1.插入一个数

2.删除一个数

3.反转一个区间

4.查询两个后缀的LCP

用Splay或者Treap都可以做,维护哈希值,二分求LCP即可。

注意反转序列的时候序列的哈希值也会改变,因此需要维护正反两个哈希值,在交换左右儿子的时候顺便交换两个哈希值即可。

还有就是打标记的同时也要进行反转,不要等pushdown的时候再反转

 #include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int N=4e5+,M=1e9+;
int n,m,ch[N][],siz[N],re[N],val[N],tot,rt;
ll h1[N],h2[N],pm[N];
char s[N];
#define l(u) ch[u][0]
#define r(u) ch[u][1]
#define mid ((l+r)>>1)
int newnode(int x) {int u=++tot; l(u)=r(u)=re[u]=,siz[u]=,val[u]=h1[u]=h2[u]=x; return u;}
void pu(int u) {
siz[u]=siz[l(u)]+siz[r(u)]+;
h1[u]=h1[l(u)]*pm[siz[r(u)]+]+val[u]*pm[siz[r(u)]]+h1[r(u)];
h2[u]=h2[r(u)]*pm[siz[l(u)]+]+val[u]*pm[siz[l(u)]]+h2[l(u)];
}
void rv(int u) {swap(l(u),r(u)),swap(h1[u],h2[u]),re[u]^=;}
void pd(int u) {if(re[u])re[u]=,rv(l(u)),rv(r(u));}
void sp(int w,int k,int& u,int& v) {
if(!w) {u=v=; return;}
pd(w);
if(k>=siz[l(w)]+)u=w,sp(r(w),k-(siz[l(w)]+),r(u),v),pu(u);
else v=w,sp(l(w),k,u,l(v)),pu(v);
}
void mg(int& w,int u,int v) {
if(!u||!v) {w=u|v; return;}
if(rand()%(siz[u]+siz[v])<siz[u])pd(u),w=u,mg(r(w),r(u),v);
else pd(v),w=v,mg(l(w),u,l(v));
pu(w);
}
void ins(int& u,int p,int x) {
int L,R;
sp(u,p,L,R),mg(L,L,newnode(x)),mg(u,L,R);
}
void del(int& u,int p) {
int L,M,R;
sp(u,p,L,R),sp(L,p-,L,M),mg(u,L,R);
}
void rev(int& u,int l,int r) {
int L,M,R;
sp(u,r,L,R),sp(L,l-,L,M);
rv(M);
mg(L,L,M),mg(u,L,R);
}
ll H(int& u,int l,int r) {
int L,M,R;
sp(u,r,L,R),sp(L,l-,L,M);
ll ret=h1[M];
mg(L,L,M),mg(u,L,R);
return ret;
}
int lcp(int& u,int L,int R) {
int l=,r=n-R+,ret;
while(l<=r) {
if(H(u,L,L+mid-)==H(u,R,R+mid-))ret=mid,l=mid+;
else r=mid-;
}
return ret;
}
void build(int& u,int l=,int r=n) {
if(l>r)return;
u=newnode(s[mid-]-''+);
build(l(u),l,mid-),build(r(u),mid+,r),pu(u);
}
int main() {
srand(time());
pm[]=;
for(int i=; i<N; ++i)pm[i]=pm[i-]*M;
while(scanf("%d%d",&n,&m)==) {
scanf("%s",s);
tot=,build(rt);
while(m--) {
int f,a,b;
scanf("%d%d",&f,&a);
if(f!=)scanf("%d",&b);
if(f==)ins(rt,a,b+),n++;
else if(f==)del(rt,a),n--;
else if(f==)rev(rt,a,b);
else if(f==)printf("%d\n",lcp(rt,a,b));
}
}
return ;
}

UVA - 11996 Jewel Magic (Treap+二分哈希)的更多相关文章

  1. UVa 11996 Jewel Magic (splay + Hash + 二分)

    题意:给定一个长度为n的01串,你的任务是依次执行如表所示的m条指令: 1 p c 在第p个字符后插入字符,p = 0表示在整个字符串之前插入2 p 删除第p个字符,后面的字符往前移3 p1 p2反转 ...

  2. UVA 11996 Jewel Magic —— splay、序列的分裂与合并、LCP的哈希算法

    #include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> ...

  3. UVA - 11996 可持久化Treap 维护Hash Ver.2

    这回总算是过了.. 4600ms+,服务器抖一抖又没了 对于极端卡时间的情况还是考虑屈服于Splay吧 #include<iostream> #include<algorithm&g ...

  4. Jewel Magic UVA - 11996 || bzoj1014: [JSOI2008]火星人prefix

    Jewel Magic UVA - 11996 这是一道用splay/非旋treap做的题(这里用的是非旋treap) 1/2/3是splay/非旋treap的常规操作.对于操作4,可以用哈希法求LC ...

  5. 2016vijos 1-1 兔子的字符串(后缀数组 + 二分 + 哈希)

    题意: 给出一个字符串,至多将其划分为n部分,每一部分取出字典序最大的子串ci,最小化 最大的ci 先看一个简化版的问题: 给一个串s,再给一个s的子串t,问能否通过将串划分为k个部分,使t成为划分后 ...

  6. POJ 2774 后缀数组 || 二分+哈希

    Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 35607   Accepted: 14 ...

  7. Codeforces 961F - k-substrings(二分+哈希)

    Codeforces 题面传送门 & 洛谷题面传送门 介绍一种奇怪的 \(\Theta(n\log n)\) 的奇怪做法. 注意到这个"border 的长度必须是奇数"的条 ...

  8. UVa 714 Copying Books(二分)

    题目链接: 传送门 Copying Books Time Limit: 3000MS     Memory Limit: 32768 KB Description Before the inventi ...

  9. UVA 10816 + HDU 1839 Dijstra + 二分 (待研究)

    UVA 题意:两个绿洲之间是沙漠,沙漠的温度不同,告诉起点,终点,求使得从起点到终点的最高温度最小的路径,如果有多条,输出长度最短的路径: 思路:用最小费用(最短路径)最大流(最小温度)也能搞吧,但因 ...

随机推荐

  1. 聊聊GO-REDIS的一些高级用法

    1. 前言 说到Golang的Redis库,用到最多的恐怕是redigo 和 go-redis.其中 redigo 不支持对集群的访问.本文想聊聊go-redis 2个高级用法 2. 开启对Clust ...

  2. 转-Uptime与数据中心等级认证

    1 数据中心等级认证 随着数据中心的蓬勃发展,越来越多的标准被制定出具.其中,Uptime Tier认证在业内是认同度最高的标准.以前,Uptime在中国的宣传很少,很多人对Uptime及其认证体系不 ...

  3. python-Web-数据库-Redis

    概述: >>>安装: >>>数据类型: string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合) &g ...

  4. VMware Workstation 15 Pro简化安装Kali Linux 2019.2

    记录下简单安装的步骤

  5. C学习笔记-基础数据结构与算法

    数据结构 数据(data)是对客观事物符号表示,在计算机中是指所有能输入的计算机并被计算机程序处理的数据总称. 数据元素(data element)是数据的基本单位,在计算机中通常做为一个整体进行处理 ...

  6. [转帖]一张图让你看懂InnoDB

    一张图让你看懂InnoDB 2018年05月10日 10:02:34 灵魂自由的忙人 阅读数 299 https://blog.csdn.net/xiaoyi23000/article/details ...

  7. 单页面应用 之 项目中集成插件vue-router

    \es6\my-complex-project>npm install  vue-router -S    (S 表示这个包下载到,当前的项目中) 导入写好的  router 这里尽量使用  @ ...

  8. C++练习 | 单链表的创建与输出(结构体格式)

    #include <iostream> #include <stdio.h> using namespace std; #define OK 1 #define ERROR 0 ...

  9. CSS3面包屑菜单导航

    在线演示 本地下载

  10. Linux安全审计

    Client: OMAudit_agent.py #!/usr/bin/env python #coding:utf- import sys import socket import fcntl im ...