维护一个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. JobHandle和依赖项

    要当您调用作业的Schedule方法时,它将返回JobHandle.您可以在代码中使用一个JobHandle作为其他作业的依赖项.如果作业取决于另一个作业的结果,您可以将第一个作业JobHandle作 ...

  2. 在 Windows 10 上用超级终端配置 Cisco 3560 Series

    在Cisco实验中,恢复路由器出厂配置是必须的内容,所以今天就由小编来为大家介绍Cisco软件怎么恢复路由器出厂配置. 1. 通过终端连接交换机1.1. 通过 Windows 的超级终端连接 Cisc ...

  3. 网站性能优化(website performance optimization)2

    我们先研究下构建渲染树前的几个步骤:也就是DOM和CSSOM,通常这些步骤的效果最差使你的网页呈现速度非常慢,我们是讨论尽可能快的将HTML流式传输给客户端,使浏览器能够开始构建DOM,还有其他注意事 ...

  4. Windows本地运行调试Spark或Hadoop程序失败:ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path

    报错内容 ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path java.io.IOExce ...

  5. Hive怎么使用远程连接

    HIVE的连接模式== 本地连接模式 直接启动hive命令 HIVE的远程连接 这里要启动HIVE的服务 thirft进行编写 hiveserver2 —- > 前台启动 后台启动 前台启动 h ...

  6. 什么是云数据库RDS PPAS 版

    云数据库PPAS版,是阿里云与EnterpriseDB公司合作基于PostgreSQL高度兼容Oracle语法的数据库服务,为用户提供易于操作的迁移工具,兼容范围涵盖:PL/SQL.数据类型.高级函数 ...

  7. python之成像库pillow

    目录 python之成像库pillow 官方文档 图像模块(Image.Image) Image模块的功能 Image.new(mode,size,color): Image.open(file,mo ...

  8. 3d旋转焦点图

    在线演示 本地下载

  9. (转)MQTT 入门介绍

    原文链接:https://blog.csdn.net/qq_2887... MQTT 入门介绍 一.简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测 ...

  10. Box-shadow制作漂亮的外阴影输入框

    背景:之前做项目中的一个移动端页面,关于在搜索框中输入信息查找对应的照片 改了几次ui图之后,最终的搜索框的设计图如下: 开始做页面的时候,就想到了用box-shadow 来实现外阴影边框.用bord ...