维护一个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. SLAM+语音机器人DIY系列:前言

    ------SLAM+语音机器人DIY系列[目录]快速导览------ 第1章:Linux基础 1.Linux简介 2.安装Linux发行版ubuntu系统 3.Linux命令行基础操作 第2章:RO ...

  2. 【转载】softmax的性质及其实现

    原文地址:https://segmentfault.com/a/1190000010039529?utm_source=tag-newest softmax函数将任意n维的实值向量转换为取值范围在(0 ...

  3. java.io.IOException 断开的管道 解决方法 ClientAbortException: java.io.IOException: Broken pipe

    今天公司技术支持的童鞋报告一个客户的服务不工作了,紧急求助,于是远程登陆上服务器排查问题. 查看采集数据的tomcat日志,习惯性的先翻到日志的最后去查看有没有异常的打印,果然发现了好几种异常信息,但 ...

  4. 四则运算计算器的微信小程序_2 运算

    js文件: function isOperator(value) {   var operatorString = '+-*/()×÷';   return operatorString.indexO ...

  5. jpa报错 Unable to acquire a connection from driver [null], user [null] and URL [null]

    jpa报错 Unable to acquire a connection from driver [null], user [null] and URL [null] 为啥报错 因为你在persist ...

  6. 从入门到自闭之Python列表,元祖及range

    1.列表 数据类型之一,存储数据,大量的,存储不同类型的数据 列表是一种有序的容器 支持索引 列表是一种可变数据类型 原地修改 列表中只要用逗号隔开的就是一个元素,字符串中只要是占一个位置的就是一个元 ...

  7. 小白学习django第五站-简易案例

    首先在setting.py文件中编写数据库配置内容 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': ' ...

  8. 快速幂(Fast_Power)

    定义快速幂顾名思义,就是快速算某个数的多少次幂. 其时间复杂度为 O(log2N), 与朴素的O(N)相比效率有了极大的提高. 以下以求a的b次方来介绍 原理把b转换成2进制数 该2进制数第i位的权为 ...

  9. node工具之nodemon

    nodemon nodemon是一种工具,可以自动检测到目录中的文件更改时通过重新启动应用程序来调试基于node.js的应用程序. 安装 npm install -g nodemon //或 npm ...

  10. ACM的一点基础知识

    所摘内容来自于XJTU小学期ACM培训PPT log 默认以2为底 计算机一秒可以看作1e8次 保证数据计算精度及数据所需必要大小 a=1LL*a*a%p//在计算时通过乘以1LL,临时将Int转化为 ...