求公共前缀的问题可以用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. rest framwork 小试身手

    models.py from django.db import models class Course(models.Model): """ 课程表 "&quo ...

  2. Linux reboot与init 6区别

    Reboot与init 6的区别 - flyingcloud_2008的专栏 - CSDN博客https://blog.csdn.net/flyingcloud_2008/article/detail ...

  3. IdentityServer4【QuickStart】之切换到混合流并且添加API访问

    切换到混合流并且添加API访问 前面的示例中我们开发了API访问和用户认证,现在我们要将两个合并到一起. OpenID Connect&OAuth 2.0组合的美妙之处是,你可以使用单一协议和 ...

  4. DLNA流媒体设置

  5. Handler主线程子线程之间的互相通信

    Handler主线程子线程之间的互相通信 package com.wyl.dansnote; import android.app.Activity; import android.os.Bundle ...

  6. uwsgi加nginx部署django restframework前后端分离项目

    一.uwsgi和nginx简介 1.uwsgi(摘抄于百度百科): uWSGI是一个Web服务器,它实现了WSGI协议.uwsgi.http等协议.Nginx中HttpUwsgiModule的作用是与 ...

  7. C#中as运算符

    as运算符用于执行引用类型的显式类型转换.如果要转换的类型与指定的类型兼容,转换就会成功进行:如果类型不兼容,as运算符就会返回null值.如下面的代码所示,如果object引用实际上不引用strin ...

  8. Python:matplotlib绘制散点图

    与线型图类似的是,散点图也是一个个点集构成的.但不同之处在于,散点图的各点之间不会按照前后关系以线条连接起来. 用plt.plot画散点图     奇怪,代码和前面的例子差不多,为什么这里显示的却是散 ...

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

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

  10. Dreamweaver怎样用Edge Web Fonts功能

    https://jingyan.baidu.com/article/37bce2beb3af6f1002f3a2c9.html