P4036 [JSOI2008]火星人

Splay维护hash,查询二分

$a[x].vl=a[lc].vl*ha[a[rc].sz+1]+a[x].w*ha[a[rc].sz]+a[rc].vl$

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef unsigned long long ull;
int read(){
char c=getchar(); int x=;
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') x=x*+c-,c=getchar();
return x;
}
#define N 300005
const int bas=;
int n,Q; char q[N],q1[]; ull ha[N];
struct node{int ch[],sz,fa; ull vl,w;}a[N];
struct Splay{
#define lc a[x].ch[0]
#define rc a[x].ch[1]
#define mid (l+r)/2
int rt,u;
inline void up(int x){
a[x].sz=a[lc].sz+a[rc].sz+,
a[x].vl=a[lc].vl*ha[a[rc].sz+]+a[x].w*ha[a[rc].sz]+a[rc].vl;
}
inline int whi(int y,int x){return a[y].ch[]==x;}
void turn(int x,int &k){
int y=a[x].fa,z=a[y].fa,l=whi(y,x),r=l^;
if(y==k) k=x;
else a[z].ch[whi(z,y)]=x;
a[a[x].ch[r]].fa=y; a[y].fa=x; a[x].fa=z;
a[y].ch[l]=a[x].ch[r]; a[x].ch[r]=y;
up(y); up(x);
}
void splay(int x,int &k){
for(;x!=k;turn(x,k)){
int y=a[x].fa,z=a[y].fa;
if(y!=k) turn(whi(z,y)==whi(y,x)?y:x,k);
}
}
int kth(int k){
int x=rt;
while(a[lc].sz+!=k){
if(a[lc].sz>=k) x=lc;
else k=k-a[lc].sz-,x=rc;
}return x;
}
inline void rep(int x,ull k){a[x=kth(x)].w=k,splay(x,rt);}
void ins(int x,ull k){
x=kth(x); ++u;
if(!rc) rc=u;
else{for(x=rc;lc;x=lc); lc=u;}
a[u].fa=x; a[u].w=k; up(u); splay(u,rt);
}
ull Fi(int x,int y){
int L=kth(x-),R=kth(y+);
splay(L,rt); splay(R,a[L].ch[]);
return a[a[R].ch[]].vl;
}
int ask(int x,int y){
if(x>y) swap(x,y);
int l=,r=u-y,re=;
while(l<=r){
if(Fi(x,x+mid-)!=Fi(y,y+mid-)) r=mid-;
else re=mid,l=mid+;
}return re;
}
int build(int Fa,int l,int r){
a[mid].w=(ull)q[mid-]; a[mid].fa=Fa; ++u;
if(l<mid) a[mid].ch[]=build(mid,l,mid-);
if(r>mid) a[mid].ch[]=build(mid,mid+,r);
up(mid); return mid;
}
}S;
int main(){
scanf("%s",q+); n=strlen(q+); ha[]=;
for(int i=;i<N;++i) ha[i]=ha[i-]*bas;
S.rt=S.build(,,n+); Q=read();//建树时记得加入边界
for(int i=,w1,w2;i<=Q;++i){
scanf("%s",q1);
if(q1[]=='Q') w1=read(),w2=read(),printf("%d\n",S.ask(w1+,w2+));
if(q1[]=='R') w1=read(),scanf("%s",q1),S.rep(w1+,(ull)q1[]);
if(q1[]=='I') w1=read(),scanf("%s",q1),S.ins(w1+,(ull)q1[]);
}return ;
}

P4036 [JSOI2008]火星人(splay+hash+二分)的更多相关文章

  1. BZOJ1014:[JSOI2008]火星人(Splay,hash)

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

  2. 【bzoj1014】[JSOI2008]火星人prefix Splay+Hash+二分

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

  3. BZOJ_1014_[JSOI2008]火星人prefix_splay+hash

    BZOJ_1014_[JSOI2008]火星人prefix_splay+hash 题意:火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam, 我们 ...

  4. BZOJ 1014 [JSOI2008]火星人prefix (Splay + Hash + 二分)

    1014: [JSOI2008]火星人prefix Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 8112  Solved: 2569[Submit] ...

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

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

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

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

  7. bzoj 1014: [JSOI2008]火星人prefix hash && splay

    1014: [JSOI2008]火星人prefix Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3154  Solved: 948[Submit][ ...

  8. bzoj1014: [JSOI2008]火星人prefix splay+hash+二分

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

  9. 洛谷 P4036 [JSOI2008]火星人(splay+字符串hash)

    题面 洛谷 题解 首先,我们知道求最长公共前缀可以用二分答案+hash来求 因为有修改操作, 考虑将整个字符串的hash值放入splay中 接着就是splay的基本操作了 Code #include& ...

随机推荐

  1. C# 模拟页面登录

    using System; using System.Collections; using System.Collections.Generic; using System.IO; using Sys ...

  2. Asp.Net 保存Session的三种方式

    一.默认方式,保存在IIS进程中保存在IIS进程中是指把Session数据保存在IIS的运行的进程中,也就是inetinfo.exe这个进程中,这也是默认的Session的存方式,也是最常用的. 这种 ...

  3. python if-else替代三元表达式

    python中判断一个数是否是偶数的常规代码: def _compare(data): if data % 2 == 0: return True else: return False # 调用偶数判 ...

  4. windows重装系统之前与之后进行的操作

    1.原系统的备份 避免重装遇到故障无法恢复,给自己留一条后路. 重装系统之前首先进行一次系统备份,我使用的备份软件是dism++,这个软件还可以完成其他的诸如空间回收.系统优化等操作: 软件地址:ht ...

  5. jmeter性能工具 之 传参 (三)

    jmeter 主要有三种方式:键值对传参,json格式传参,外部传参 1.键值对传参 可以参考上篇登陆,使用的传参方式是键值对传参  2.json 格式传参 用json 格式传参不要忘了加http 头 ...

  6. Kettle日志级别

    Kettle的日志级别LogLevel分为以下几个: Nothing 没有日志 不显示任何输出 Error 错误日志 仅仅显示错误信息 Minimal 最小日志 使用最小的日志 Basic 基本日志 ...

  7. Ubuntu 18.04 安装 CUDA 9.0

    sudo dpkg -i cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64.deb sudo apt-key add /var/cuda-repo-< ...

  8. Cobaltstrike系列教程(二)-Listner与Payload生成 heatlevel

    0x000-前文 Cobaltstrike系列教程(一)简介与安装 0x001-Listner(监听器)介绍 ①Cobaltstrike listner简介 可能有一些小白并不理解什么叫做listne ...

  9. Delphi GridPanel Percent百分比设置

    可能很多人都有这个困扰,为什么每次设置一个百分比后,值都会改变,只有设置成absolute​才会正常,经摸索发现,是因为精度引起,设置percent的时候,需要将精确到多个小数位.如要有3列,需要设置 ...

  10. 电脑如何连接windows server服务器

    第一步:win+r 启动‘运行’,输入mstsc 第二步:连接远程桌面,输入服务器ip 第三步,输入账户密码,登陆即可. 注释:mstsc,全称 Microsoft Telnet Screen Con ...