【bzoj1014】: [JSOI2008]火星人prefix 平衡树-字符串-hash-二分
用平衡树维护字符串的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-二分的更多相关文章
- bzoj1014: [JSOI2008]火星人prefix(splay+hash+二分)
题目大意:一个字符串三个操作:①求两个后缀的LCP②插入一个字符③修改一个字符. 前几天刚学了hash+二分求lcp,就看到这题. 原来splay还能这么用?!原来splay模板这么好写?我以前写的s ...
- 【BZOJ】1014: [JSOI2008]火星人prefix(splay+hash+二分+lcp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1014 题意:支持插入一个字符.修改一个字符,查询lcp.(总长度<=100000, 操作< ...
- BZOJ1014[JSOI2008]火星人prefix(splay维护hash)
Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 ...
- BZOJ1014 JSOI2008 火星人prefix 【非旋转Treap】*
BZOJ1014 JSOI2008 火星人prefix Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符 ...
- [BZOJ1014][JSOI2008]火星人prefix
[BZOJ1014][JSOI2008]火星人prefix 试题描述 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字 ...
- 2018.06.28 BZOJ1014 [JSOI2008]火星人prefix(非旋treap+hash)
[JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MB Submit: 8951 Solved: 2860 Description 火星 ...
- bzoj千题计划106:bzoj1014 [JSOI2008]火星人prefix
http://www.lydsy.com/JudgeOnline/problem.php?id=1014 两个后缀的最长公共前缀:二分+hash 带修改带插入:splay维护 #include< ...
- [Bzoj1014][JSOI2008]火星人prefix(无旋Treap&hash)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1014 因为涉及到增加和修改,所以后缀数组就被pass掉了,想到的就是平衡树维护hash值 ...
- [bzoj1014][JSOI2008]火星人prefix_非旋转Treap_hash_二分
火星人prefix bzoj-1014 JSOI-2004 题目大意:给定一个字符串,支持三种操作:1.查询:两个后缀之间的$LCP$:2.单点修改:3.插入一个字符. 注释:$1\le n\le 1 ...
随机推荐
- 16c550芯片编写的优化
参考了 <Altera FPGA/CPLD 设计>高级篇, 关于状态机的推荐写法实现的功能是一样的但是编译使用的逻辑门如下图: 下图是我自己编的状态机需要的逻辑: 下图是使用推荐的有限状态 ...
- SQL Server专题
SQL Server 2005/2008 一.连接异常 在C#代码中调用Open()方法打开数据库连接时(账户为sa),出现异常:异常信息如下: 在与 SQL Server 建立连接时出现与网络相关的 ...
- Deep Learning 学习笔记(1):线性回归( Linear Regression )
关于DL,由于我是零经验入门, 事实上我是从最简单的ML开始学起, 所以这个系列我也从ML开始讲起. ===============并行分割线================= 一.线性回归 线性回归 ...
- VS2010中将CString转换为const char*
最近碰到了CString 转 const char *的问题. 以前只要简单的一个强制转换就OK了,可现在是不行了,搜索了很多资料,终于搞定,主要是Unicode和ANSI的问题,只要做一个转换就可以 ...
- C#向pdf 添加水印
调用直接这样用: //PDFHelper.AddImageWatermarkPDF(path, "D://my.pdf", Server.MapPath("/HtmlTo ...
- random和os模块
一.random模块 常用方法如下: #-*- coding:utf-8 -*- import random print(random.randint(1,100)) # 获取一个范围内的随机数,包含 ...
- 算法技巧讲解》关于对于递推形DP的前缀和优化
这是在2016在长沙集训的第三天,一位学长讲解了“前缀和优化”这一技巧,并且他这一方法用的很6,个人觉得很有学习的必要. 这一技巧能使线性递推形DP的速度有着飞跃性的提升,从O(N2)优化到O(N)也 ...
- 带你剖析WebGis的世界奥秘----Geojson数据加载(高级)(转)
带你剖析WebGis的世界奥秘----Geojson数据加载(高级) 转:https://zxhtom.oschina.io/zxh/20160819.html 编程 java 2016/08/ ...
- Memcached 原理
memcached 是以一个守护进程的方式运行于一个服务器和多个服务器之间的,等待接受客户端的连接操作,客户端可以有各种语言编写.(例如PHP). php 在客户端与服务器建立连接以后,接下来的事情 ...
- 用TCGA数据库分析癌症和癌旁组织的表达差异
上周收到一条求助信息:“如何用TCGA数据库分析LINC00152在卵巢癌与正常组织的的表达差异?” 所以以这个题目为记录分析过程如下: 一.下载数据 a)进入网站https://cancergeno ...