求公共前缀的问题可以用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. react 路由4 学习

    表单控件 受控表单组件 非受控的表单组件 demo:收集表单提交的数据 路由(V4) 特点:一切皆是组件 官网:https://reacttraining.com/react-router/ npm ...

  2. react 路由 react-router-dom

    import React from 'react'; import DataList from './data' import Tr from './Tr' // import One from '. ...

  3. MyEclipse 配置 Tomcat

    安装好Tomcat,MyEclipse 之后,利用这两个工具可以开发部署Web 应用,步骤相对手动部署要简洁的多,这里有一个特别要注意的地方:系统里安装JDK.Tomcat.MyEclipse 的版本 ...

  4. [转帖]Runtime, Engine, VM 的区别是什么?

    这就是个WiFi和WLAN关系的问题嘛.Runtime是指用于支持程序运行时的组件,它可以是个Engine和/或VM.VM是一种系统抽象,它提供代码执行所需的API环境.Engine是一种处理抽象,它 ...

  5. Oracle创建及调用存储过程

  6. PL/SQL如何调试sql语句、存储过程

    一直以来,我总是在sql的工具,比如sql server.navicat等中执行sql语句来发现问题自己写的sql中的问题,结果被问起时,让人贻笑大方! 那么如何调试成白行的存储过程?如何调试成百行s ...

  7. Flutter上拉加载下拉刷新---flutter_easyrefresh

    前言 Flutter默认不支持上拉加载,下拉刷新也仅仅支持Material的一种样式.Android开发使用过SmartRefreshLayout的小伙伴都知道这是一个强大的刷新UI库,集成了很多出色 ...

  8. @Param注解

    关于mybatis的@Param注解和参数 引用 https://www.cnblogs.com/whisper527/p/6568028.html 薇飘意 1,使用@Param注解 当以下面的方式进 ...

  9. Mysql优化单表查询

    借助explain分析SQL,判断该怎么建立索引. 还需要注意,有些情况会导致索引失效,用不上索引,应该优化SQL,应用上索引. 什么情况导致索引失效? 1.在索引列上做任何操作(计算.函数.类型转换 ...

  10. Java8 flatMap的sample

    外国人写得, 很不错 http://www.java67.com/2016/03/how-to-use-flatmap-in-java-8-stream.html package test; impo ...