【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. 01Javascript简介

    01 - Javascript 简介 web前端有三层: HTML:从语义的角度, 描述页面结构 CSS: 从审美的角度,描述样式(美化页面) JavaScript: 从交互的角度 , 描述行为(提升 ...

  2. C# 泛型类型参数的约束

    在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制.如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误.这些限制称为约束.约束是使用 where 上 ...

  3. 斐波那契数列,跳台阶(dp思想)

    一 . 斐波那契数列:1,1,2,3,5,8,13,21 即后一项是前两项的和. class Solution { private: ]; public: Solution() { memset(ar ...

  4. 主机不能访问虚拟机中的web服务【解决方案】

    百度了其它一些方法都不行,最后实在没辙,关了windows防火墙和Linux防火墙,居然能够访问了,我服. 总结一下,原来是Red Hat Linux 6.0防火墙没有开启端口80,开启的方法为(老版 ...

  5. 170318 11:44:26 [ERROR] Can't start server: can't create PID file: No space left on device

    数据库挂了.打开远程,进了系统,service mysqld stop 失败.service mysqld start等了好大一会,提示Timeout error occurred trying to ...

  6. 【poj1679】The Unique MST

    [题目大意] 共T组数据,对于每组数据,给你一个n个点,m条边的图,设图的最小生成树为MST,次小生成树为ans,若MST=ans,输出Not Unique!,否则输出MST [题解] 很明确,先求M ...

  7. ThinkPHP3.2 插入数据库数据,缓存问题

    每个字段都是有数据的,可是就是is_new插不进去, 最后的原因就是TP有数据库字段缓存,FUCK 把RunTIme下面的Data文件夹删除掉,在开发模式中就把自动缓存改成Fasle

  8. ROS naviagtion analysis: costmap_2d--Layer

    博客转载自:https://blog.csdn.net/u013158492/article/details/50493113 这个类中有一个LayeredCostmap* layered_costm ...

  9. weblogic参数说明

    公司有个项目,部署在weblogic8.1上之后,发现比在tomcat下慢很多,经过分析排查,原因是web应用的WEB-INF下的weblogic.xml里的参数设置不合理(使用默认值有时并非最佳值) ...

  10. Luogu 4841 城市规划

    BZOJ 3456 权限题 太菜了推不出式子 我们设$f(n)$表示$n$个点的无向连通图的数量,那么有 $$f(n) = 2^{\binom{n}{2}} - \sum_{i = 1}^{n - 1 ...