【bzoj1014】: [JSOI2008]火星人

用平衡树维护字符串的hash

然后询问的时候二分一下就好了

 /* http://www.cnblogs.com/karl07/ */
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define ull unsigned long long const int N=;
const int P=;
struct tre{
int key,sz,t;
ull hash;
tre *ls,*rs;
}t[N*],*NEW=t,*null=t,*root,*r1,*r2,*r3;
ull base[N];
char s[N];
int n; inline tre *new1(int x){
NEW++;
NEW->t=x;
NEW->key=rand();
NEW->sz=;
NEW->hash=x;
NEW->ls=NEW->rs=null;
return NEW;
} inline void update(tre *p){
p->sz=p->ls->sz++p->rs->sz;
p->hash=p->ls->hash*base[p->rs->sz+]+p->t*base[p->rs->sz]+p->rs->hash;
} void merge(tre *&p,tre *x,tre *y){
if (x==null) { p=y; return; }
if (y==null) { p=x; return; }
if (x->key>y->key){
p=x;
merge(p->rs,p->rs,y);
}else{
p=y;
merge(p->ls,x,p->ls);
}
update(p);
} void split(tre *p,tre *&x,tre *&y,int k){
if (k==) { x=null,y=p; return; }
if (k==p->sz) { y=null,x=p; return; }
if (k>=p->ls->sz+){
x=p;
split(p->rs,p->rs,y,k-p->ls->sz-);
}else{
y=p;
split(p->ls,x,p->ls,k);
}
update(p);
} void HASH(){
null->ls=null->rs=null;
null->hash=;
null->sz=null->t=;
null->key=-;
root=null;
base[]=;
for (int i=;i<N;i++) base[i]=base[i-]*P;
} inline ull Q(tre *p,int l,int x){
ull ans;
split(root,r1,r2,l-);
split(r2,r2,r3,x);
ans=r2->hash;
merge(r2,r2,r3);
merge(root,r1,r2);
return ans;
} inline void R(int l,int x){
split(root,r1,r2,l-);
split(r2,r2,r3,);
merge(r1,r1,new1(x));
merge(root,r1,r3);
} inline void I(int l,int x){
split(root,r1,r2,l);
merge(r1,r1,new1(x));
merge(root,r1,r2);
} inline int query(int x,int y){
if (x>y) swap(x,y);
int l=,r=root->sz-y+,ans=;
while (l<=r){
int mid=(l+r)/;
ull a1=Q(root,x,mid),a2=Q(root,y,mid);
if (a1==a2){
ans=mid;
l=mid+;
}else{
r=mid-;
}
}
return ans;
} int main(){
HASH();
scanf("%s",s);
scanf("%d",&n);
for (int i=,l=strlen(s);i<=l-;i++){
merge(root,root,new1(s[i]));
}
for (int i=,x,y;i<=n;i++){
char ss[],s1[];
scanf("%s",ss);
if (ss[]=='Q') { scanf("%d%d",&x,&y); printf("%d\n",query(x,y)); }
if (ss[]=='R') { scanf("%d%s",&x,s1); R(x,s1[]);}
if (ss[]=='I') { scanf("%d%s",&x,s1); I(x,s1[]);}
}
return ;
}

并不会splay。。只会非旋转treap。。10s正好卡过去。。药丸

【bzoj1014】: [JSOI2008]火星人prefix 平衡树-字符串-hash-二分的更多相关文章

  1. bzoj1014: [JSOI2008]火星人prefix(splay+hash+二分)

    题目大意:一个字符串三个操作:①求两个后缀的LCP②插入一个字符③修改一个字符. 前几天刚学了hash+二分求lcp,就看到这题. 原来splay还能这么用?!原来splay模板这么好写?我以前写的s ...

  2. 【BZOJ】1014: [JSOI2008]火星人prefix(splay+hash+二分+lcp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1014 题意:支持插入一个字符.修改一个字符,查询lcp.(总长度<=100000, 操作< ...

  3. BZOJ1014[JSOI2008]火星人prefix(splay维护hash)

    Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 ...

  4. BZOJ1014 JSOI2008 火星人prefix 【非旋转Treap】*

    BZOJ1014 JSOI2008 火星人prefix Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符 ...

  5. [BZOJ1014][JSOI2008]火星人prefix

    [BZOJ1014][JSOI2008]火星人prefix 试题描述 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字 ...

  6. 2018.06.28 BZOJ1014 [JSOI2008]火星人prefix(非旋treap+hash)

    [JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MB Submit: 8951 Solved: 2860 Description 火星 ...

  7. bzoj千题计划106:bzoj1014 [JSOI2008]火星人prefix

    http://www.lydsy.com/JudgeOnline/problem.php?id=1014 两个后缀的最长公共前缀:二分+hash 带修改带插入:splay维护 #include< ...

  8. [Bzoj1014][JSOI2008]火星人prefix(无旋Treap&hash)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1014 因为涉及到增加和修改,所以后缀数组就被pass掉了,想到的就是平衡树维护hash值 ...

  9. [bzoj1014][JSOI2008]火星人prefix_非旋转Treap_hash_二分

    火星人prefix bzoj-1014 JSOI-2004 题目大意:给定一个字符串,支持三种操作:1.查询:两个后缀之间的$LCP$:2.单点修改:3.插入一个字符. 注释:$1\le n\le 1 ...

随机推荐

  1. Arp内网毒化

    攻击者:192.168.220.143 受害者:192.168.220.137 默认网关:192.168.220.2 首先,开启IP转发 使用工具Arpspoof进行ARP毒化,把受害者的流量传送给网 ...

  2. 简单 JS 弹出层 背景变暗

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. Deep Learning(深度学习)学习笔记整理系列

    http://blog.csdn.net/zouxy09/article/details/8775360 http://blog.csdn.net/zouxy09/article/details/87 ...

  4. java Web中页面跳转方式之重定向和请求转发的区别

    请求转发: request.getRequestDispatcher().forward(); 重定向: response.sendRedirect(); 例如: 请求转发: request.getR ...

  5. 如何将Eclipse中的开源项目使用到Android Studio中

    近几日,笔者用到了一些开源项目,比如著名的PTR项目.但是在使用的过程中,遇到了一些问题. 这个开源库是在Eclipse上面写的,我们现在开发用的是Android stuido. 两种软件的项目结构是 ...

  6. 02-nginx信号量

    刚才完了nginx的编译,nginx的编译还是挺简单的.控制nginx:重启.关闭.只有孤零零的一个二进制文件nginx 通过信号来控制它,Linux操作系统进程与进程之间通过信号来通信.荷兰的一位计 ...

  7. java简单的测试方法执行了多少时间

    (1)以毫秒为单位的 long startTime = System.currentTimeMillis(); // 获取开始时间 // doThing(); // 测试的代码段 long endTi ...

  8. c++ list 容器

    List vector在STL中是一个双向链表,它的内部结构和vector 或 deque截然不同.主要有以下几点: 1.List不支持随机存取.list没有提供下标操作符和at()的访问. 2.任何 ...

  9. win10 Kinect2 Visualstudio2015 opencv3环境搭建

    1.下载kinect SDK ( Kinect for Windows SDK 2.0 ):  https://www.microsoft.com/en-us/download/details.asp ...

  10. CF547D Mike and Fish

    欧拉回路,巧妙的解法. 发现每一个点$(x, y)$实际上是把横坐标和$x$和纵坐标$y$连一条线,然后代进去跑欧拉回路,这样里一条边对应了一个点,我们只要按照欧拉回路间隔染色即可. 注意到原图可能并 ...