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

    初识WebSocket: index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8 ...

  2. 【学习总结】Markdown 使用的正确姿势

    参考资料:Learning-Markdown 入门参考 注:原博可能对GitHub中的Markdown格式更适用. 有时间可以再GitHub中尝试并写一篇相关攻略. ps:在王熊猫的GitHub里也有 ...

  3. js中的一些方法

    数组 //map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果. 返回值:一个新数组,每个元素都是回调函数的结果. var array1 = [1, 4, 9, ...

  4. Kernel Functions-Introduction to SVM Kernel & Examples - DataFlair

    Kernel Functions-Introduction to SVM Kernel & Examples - DataFlairhttps://data-flair.training/bl ...

  5. 前端三大框架Angular & React & Vue

    前端三大框架: Angular[Google]:一套框架,多种平台移动端 & 桌面端.学会用Angular构建应用,然后把这些代码和能力复用在多种多种不同平台的应用上 —— Web.移动 We ...

  6. python3 网页下拉框和悬浮框操作基础汇总

    #悬浮定位操作 from selenium.webdrier import ActionChains #浏览器实例化 #定位移动的位置赋给一个参数 ActionChains(浏览器).move_to_ ...

  7. C\C++学习笔记 1

    C++记录1 C的头文件为math.h C++的为 cmath using编译指令 namespace 区分不同产品的函数.Mics::cout Linux::cout cout << 即 ...

  8. css太极

    自己用css做的太极,留个纪念. 用css做太极有很多种实现方法,我这种大概是最简单的了吧,因为div用得太多了,哈哈. 高级一点的应该是用伪类:before和:after去减少div的用量(手动滑稽 ...

  9. 4面向对象(OOP)

    学习线路 初学: 熟悉语法 进阶: 1.23种设计模式 2.6中开发原则 高级: 1.优化 2.架构 3.安全 概念 类:一类具有相同特性的事物的抽象描述,用一个java类表示. 成员变量:抽取的属性 ...

  10. zabbix自定义监控项

    原因:zabbix监控系统自带的监控规则有限,如果需要更加灵活的定义监控项,可以通过修改配置文件实现 vim xxx/zabbix_agentd.conf UnsafeUserParameters=1 ...