【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. window下配置Solr6.5以及IK Analyzer分词配置

    一.安装准备及各软件使用版本说明: 1.下载jdk,我下载的版本是jdk-8u121-windows-x64.exe,下载地址: http://www.oracle.com/technetwork/j ...

  2. Linux - apache 服务

    暂时关闭 iptables 防火墙 [root@sch01ar ~]# systemctl stop iptables.service 暂时关闭 firewall 防火墙 [root@sch01ar ...

  3. java成神之——HttpURLConnection访问api

    HttpURLConnection 访问get资源 访问post资源 访问Delete资源 获取状态码 结语 HttpURLConnection 访问get资源 HttpURLConnection c ...

  4. Python中常用模块一

    random模块 import random # 应用数学计算 print(random.random()) # 取随机小数 范围是 0-1之间 # 应用抽奖 , 彩票 print(random.ra ...

  5. javascript中的垃圾回收

    1引用计数垃圾回收 核心:跟踪记录对象被引用的次数.思路是如果一个对象A被赋值给了一个变量v,则该对象A的引用计数值加1,如果变量v又被赋予其他值了,比如a="str",则该对象A ...

  6. SSD惊悚的跪了,找回数据

    1.电脑出现小bug,例如显示乱码,开机变慢等,都是SSD跪的前兆,哭,我怎么就没看出来,而且没有备份过数据. 2.终于,PC死机了...OK,重启,纳尼?起不来... 3.大哭,所有代码,所有论文不 ...

  7. stm32中断 抢占优先级 和 响应优先级 有什么区别

    与51不同,stm32的中断分类更灵活.51只是按先后顺序大小排列互相打断. stm32中多了响应优先级这一概念. stm32的中断分为 1.抢占(占先)优先级. 2.响应优先级. 1.抢占优先级.抢 ...

  8. fatal error C1083: 无法打开包括文件:“qedit.h”: No such file or directory

    VS2010编译 DirectShow一些项目时遇到 错误:fatal error C1083: 无法打开包括文件:“qedit.h”: No such file or directory 解决方法: ...

  9. vue简单路由(二)

    在实际项目中我们会碰到多层嵌套的组件组合而成,但是我们如何实现嵌套路由呢?因此我们需要在 VueRouter 的参数中使用 children 配置,这样就可以很好的实现路由嵌套. index.html ...

  10. python动态爬取网页

    简介 有时候,我们天真无邪的使用urllib库或Scrapy下载HTML网页时会发现,我们要提取的网页元素并不在我们下载到的HTML之中,尽管它们在浏览器里看起来唾手可得. 这说明我们想要的元素是在我 ...