求公共前缀的问题可以用hash+二分来解决,但这个是动态的,所以我们用平衡树来维护区间的hash值

复杂度$O(mlog^2n)$

 #include<bits/stdc++.h>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pa;
const int maxn=1e5+,P=;
const ull RUA=1145141919810ll; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int ch[maxn][],pct,fa[maxn],siz[maxn];
char v[maxn],s[maxn];
ull sum[maxn],bin[maxn];
int M,rt; inline void print(int x){
if(!x) return;
print(ch[x][]);
// printf("!%d %d %d %d\n",x,ch[x][0],ch[x][1],fa[x]);
print(ch[x][]);
} inline bool isrc(int x){return x==ch[fa[x]][];} inline void update(int x){
siz[x]=siz[ch[x][]]+siz[ch[x][]]+;
sum[x]=(sum[ch[x][]]*bin[]+v[x])*bin[siz[ch[x][]]]+sum[ch[x][]];
} inline void rotate(int x){
int f=fa[x],ff=fa[f];bool b=isrc(x);
if(ff) ch[ff][isrc(f)]=x; fa[x]=ff;
if(ch[x][!b]) fa[ch[x][!b]]=f; ch[f][b]=ch[x][!b];
fa[f]=x;ch[x][!b]=f;
update(f),update(x);
} inline void splay(int x,int tar){
while(fa[x]!=tar&&fa[fa[x]]!=tar){
if(isrc(x)==isrc(fa[x])) rotate(fa[x]);
else rotate(x);rotate(x);
}if(fa[x]!=tar) rotate(x);
if(!tar) rt=x;
} inline int findkth(int k){
if(k>pct) return ;
int x=rt;
while(){
int w=siz[ch[x][]];
if(k<=w) x=ch[x][];
else if(k==w+) return x;
else k-=w+,x=ch[x][];
}
} inline void insert(int x,char y){
int p=findkth(x+);
splay(p,);
int q=findkth(x+);
splay(q,p);
int n=++pct;
sum[n]=v[n]=y,siz[n]=;fa[n]=q,ch[q][]=n;
splay(n,);
} inline void change(int x,char y){
int p=findkth(x+);
v[p]=y;update(p);
splay(p,);
} inline ull query(int x,int y){
int p=findkth(x);
if(!p) return RUA;
splay(p,);
int q=findkth(y+);
if(!q) return RUA;
splay(q,p);
return sum[ch[q][]];
} int main(){
//freopen("","r",stdin);
int i,j,k;
bin[]=;for(i=;i<=1e5;i++) bin[i]=bin[i-]*P;
ch[rt=][]=;siz[]=;
fa[pct=]=;siz[]=;
scanf("%s",s+);int len=strlen(s+);
for(i=;i<=len;i++){
insert(i-,s[i]);
}
M=rd();
for(i=;i<=M;i++){
char op[];scanf("%s",op);
if(op[]=='Q'){
int x=rd(),y=rd();
int l=,r=pct-,ans=;
while(l<=r){
int m=l+r>>;
ull a=query(x,x+m-),b=query(y,y+m-);
if(a==b&&a!=RUA) ans=m,l=m+;
else r=m-;
}
printf("%d\n",ans);
}else if(op[]=='I'){
int x=rd();scanf("%s",op);
insert(x,op[]);
}else{
int x=rd();scanf("%s",op);
change(x,op[]);
}
}
return ;
}

bzoj1014 火星人 (hash+splay+二分答案)的更多相关文章

  1. [BZOJ1014] [JSOI2008] 火星人prefix (splay & 二分答案)

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

  2. BZOJ 1014 [JSOI2008]火星人prefix (splay+二分答案+字符串hash)

    题目大意:维护一个字符串,支持插入字符和替换字符的操作,以及查询该字符串两个后缀的最长公共前缀长度 乍一看以为是后缀数组,然而并没有可持久化后缀数组(雾) 看题解才知道这是一道splay题,首先要对s ...

  3. BZOJ1014: [JSOI2008]火星人prefix(splay 二分 hash)

    题意 题目链接 Sol 一眼splay + 二分hash,不过区间splay怎么写来着呀 试着写了两个小时发现死活不对 看了一下yyb的代码发现自己根本就不会splay.... // luogu-ju ...

  4. 【BZOJ-1014】火星人prefix Splay + 二分 + Hash

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

  5. BZOJ 1014: [JSOI2008]火星人prefix [splay 二分+hash] 【未完】

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

  6. BZOJ1014火星人prefix Splay維護序列 + 字符串哈希

    @[Splay, 哈希] Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:\(madamimadam\), 我们将这个字符串的各个字符予以标号 ...

  7. BZOJ 1014: [JSOI2008]火星人prefix Splay+二分

    1014: [JSOI2008]火星人prefix 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1014 Description 火星人 ...

  8. [JSOI2008]火星人 hash+splay

    题目描述: 现在,火星人定义了一个函数 LCQ(x, y)LCQ(x,y),表示:该字符串中第 xx 个字符开始的字串,与该字符串中第 yy 个字符开始的字串,两个字串的公共前缀的长度.比方说,LCQ ...

  9. 【BZOJ1014】火星人(Splay,哈希)

    [BZOJ1014]火星人(Splay,哈希) 题面 BZOJ 题解 要动态维护这个串,一脸的平衡树. 那么用\(Splay\)维护这个哈希值就好了. 每次计算答案的时候二分+Splay计算区间哈希值 ...

随机推荐

  1. 【学习总结】 小白CS成长之路

    2017-9-3:入坑. 理想:敲着代码唱着歌. 现实:骨感. Step 1: 认识CS: CS大体可以分成以下几个大领域:硬件.系统.软件.网络.计算理论.计算方法. 硬 件 ---- 数字电路.集 ...

  2. Linux&Windows中VNC协议及使用方法

    [转载]window下使用vnc远程登录ubuntu/linux图形界面_五个粽子_新浪博客http://blog.sina.com.cn/s/blog_677265f601012mqg.html V ...

  3. WIN10 devtoolsuser

    visual studio - UWP: What is the DevToolsUser Password? - Stack Overflowhttps://stackoverflow.com/qu ...

  4. vue路由动态过渡效果

    不多说,直接上代码 import Vue from 'vue' //引入vue import VueRouter from 'vue-router' //引入路由 Vue.use(VueRouter) ...

  5. composer 自动加载 通过classmap自动架子啊

    https://github.com/brady-wang/composer github地址 composer加载自己写的类 放入一个目录下 更改composer.json "autolo ...

  6. 4.请介绍一下c++和Java的区别

    1.指针 2.c++多重继承,Java只能继承一个父类,但是可以继承多个接口 3.数据类型及类,Java完全面向对象,所有函数和变量都必须是类的一部分.而c++允许将函数和变量定义为全局,Java取消 ...

  7. 微信小程序登录授权并获取手机号

    一.请求发送 携带 code 到后台换取 openid var that = this; wx.login({ success(res) { console.log(res); var code = ...

  8. CentOS7装Tomcat

    有两种安装方式:(1)yum 命令  (2)安装包 本次采用第二种方式: 1.windos下载apache-tomcat-7.0.73.tar.gz安装包 2.通过WinSCP传到linux下(本次放 ...

  9. centos7根分区扩容(亲测有效)

    root@haojftest:~# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos_test2-root 28G 14G 15G % / devtmpfs ...

  10. 莫烦sklearn学习自修第八天【过拟合问题】

    1. 什么是过拟合问题 所谓过拟合问题指的是使用训练样本进行训练时100%正确分类或规划,当使用测试样本时则不能正确分类和规划 2. 代码实战(模拟过拟合问题) from __future__ imp ...