P4036 [JSOI2008]火星人(splay+hash+二分)
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+二分)的更多相关文章
- BZOJ1014:[JSOI2008]火星人(Splay,hash)
Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam, 我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 ...
- 【bzoj1014】[JSOI2008]火星人prefix Splay+Hash+二分
题目描述 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 8 9 10 ...
- BZOJ_1014_[JSOI2008]火星人prefix_splay+hash
BZOJ_1014_[JSOI2008]火星人prefix_splay+hash 题意:火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam, 我们 ...
- BZOJ 1014 [JSOI2008]火星人prefix (Splay + Hash + 二分)
1014: [JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 8112 Solved: 2569[Submit] ...
- 【BZOJ】1014: [JSOI2008]火星人prefix(splay+hash+二分+lcp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1014 题意:支持插入一个字符.修改一个字符,查询lcp.(总长度<=100000, 操作< ...
- bzoj1014: [JSOI2008]火星人prefix(splay+hash+二分)
题目大意:一个字符串三个操作:①求两个后缀的LCP②插入一个字符③修改一个字符. 前几天刚学了hash+二分求lcp,就看到这题. 原来splay还能这么用?!原来splay模板这么好写?我以前写的s ...
- bzoj 1014: [JSOI2008]火星人prefix hash && splay
1014: [JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3154 Solved: 948[Submit][ ...
- bzoj1014: [JSOI2008]火星人prefix splay+hash+二分
Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 ...
- 洛谷 P4036 [JSOI2008]火星人(splay+字符串hash)
题面 洛谷 题解 首先,我们知道求最长公共前缀可以用二分答案+hash来求 因为有修改操作, 考虑将整个字符串的hash值放入splay中 接着就是splay的基本操作了 Code #include& ...
随机推荐
- JSP学习(5)
JSP学习(5) 保存用户状态的两大机制 session对象 Cookie Cookie简介 是Web服务器保存在客户端的一系列文本信息 典型应用 判断注册用户是否已经登录 购物车处理 作用 对特定对 ...
- pg_restore - 从一个由 pg_dump 创建的备份文件中恢复 PostgreSQL 数据库。
SYNOPSIS pg_restore [ option...] [ filename] DESCRIPTION 描述 pg_restore 是一种用于恢复由 pg_dump(1) 创建的任何非纯文本 ...
- 237-基于Xilinx Kintex-7 XC7K325T 的FMC/千兆以太网/SATA/四路光纤数据转发卡
基于Xilinx Kintex-7 XC7K325T 的FMC/千兆以太网/SATA/四路光纤数据转发卡 一. 板卡概述 本板卡基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片, ...
- nodejs 更新代码自动刷新页面
安装第三方工具: nodemon npm install --global nodemon 安装完毕后使用: 之前使用: node xxx.js 改成 nodemon xxx.js 只要通过nodem ...
- Invalid operator< assertion error解析
这两天忙着在准备3月份打PAT考试,许久没有接触刷题了,各种生疏各种忘记,刷题速度那是一个慢,真是为自己智商着急.今天刷题碰到了一个有意思的编程习惯性错误,好几道题都涉及到自定义排序,需要自己重写&l ...
- #10042. 「一本通 2.1 练习 8」收集雪花 || 离散化 || 双指针法 || C++ || LOJ
题目:#10042. 「一本通 2.1 练习 8」收集雪花 看到网上没有这道题的题解,所以写一下. 要标记数字是否存在,看到x<=1e9,所以考虑用离散化,然后开一个last数组,last[i] ...
- Less 混合(mixin)
Less的混合:混合可以将一个定义好的class A轻松的引入到另一个class B中,从而简单实现class B继承class A中的所有属性.我们还可以带参数地调用,就像使用函数一样. .bord ...
- spark与Hadoop的区别
1. Mapreduce和Spark的相同和区别 两者都是用mr模型来进行并行计算 hadoop的一个作业:job job分为map task和reduce task,每个task都是在自己的进程中运 ...
- linux运维、架构之路-网络基础
一. 常用网络设备 1.交换机:实现多台主机之间互相通讯的需求 交换机实现互相通讯的要求: ①主机身份标识信息:mac地址,利用源mac和目标mac地址,进行身份信息识别 ②主机通过交换机识别目标主机 ...
- 未能加载文件或程序集 ICSharpCode.SharpZipLib
Ui调用Webservice ,Webservice调用Bl BL中明明有那个dll文件 后来发现是webservice里面没有 在附加调试的时候,断点在bl层中