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. sqli-5&6

    第五关 Double Injection - Single Quotes - String (双注入GET单引号字符型注入) 1.发现前几关的方法都不能用了,要么报错(没有其他有关信息.要么什么也不出 ...

  2. linux手动测试 rsync 的同步情况

    特别强调:此步很关键,如果这不能同步,后面的 inotify 配好了也不会同步数据. 1) 分别创建待同步数据 [root@rsync-client-inotify ~]# mkdir /data/{ ...

  3. wc 统计文件的行数

    1.命令功能 wc 统计文件的行数,单词和字节数 2.语法格式 wc  option  file wc  option  --files0-from=F 参数说明 参数 参数说明 -c 统计字节数 - ...

  4. [Usaco2007 Jan]Telephone Lines架设电话线(最短路,二分)

    [Usaco2007 Jan]Telephone Lines架设电话线 Description FarmerJohn打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向 ...

  5. Ts 的类

    TS 中的公共.私有和受保护的修饰符: 1.public表示公共的,用来指定在创建实例后可以通过实例访问的,也就是类定义的外部可以访问的属性和方法.默认是 public 2.private修饰符表示私 ...

  6. 对排序(Sort)的研究

    这一篇主要是介绍一些数据排序的基本算法和高级算法并利用JavaScript来逐一实现, 算法的说明: 稳定:如果a原本在b前面,当a=b时,排序之后a仍然在b的前面 不稳定:如果a原本在b的前面,当a ...

  7. 对logistic回归分析的两重认识

    logistic回归,回归给人的直观印象只是要求解一个模型的系数,然后可以预测某个变量的回归值.而logistic回归在应用中多了一层含义,它经常应用于分类中.第一重认识:logistic是给真正的回 ...

  8. 调整ceph的pg数(pg_num, pgp_num)

    https://www.jianshu.com/p/ae96ee24ef6c 调整ceph的pg数 PG全称是placement groups,它是ceph的逻辑存储单元.在数据存储到cesh时,先打 ...

  9. Hadoop 学习目录(搁置)

    简介 Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储.Hadoop实现了一个分布式文件系 ...

  10. [HG]奋斗赛G

    T1 题目描述 安娜斯塔西娅喜欢去乌日扬迪安中央公园散步. 但她对简单的散步不感兴趣,于是她开始收集公园里的鹅卵石. 一开始,她决定收集所有她能在公园里找到的鹅卵石. 她只有两个口袋. 她能在每个口袋 ...