bzoj 1014: 洛谷 P4036: [JSOI2008]火星人
题目传送门:洛谷P4036。
题意简述:
有一个字符串,支持插入字符,修改字符。
每次需要查询两个后缀的LCP长度。
最终字符串长度\(\le 100,\!000\),修改和询问的总个数\(\le 150,\!000\),查询操作\(\le 10,\!000\)。
题解:
由后缀和LCP可以想到后缀数组或后缀自动机,但是它们都无法插入或修改。
考虑到LCP可以通过二分+哈希的方式来计算,考虑维护区间的哈希值。
这里使用平衡树无旋Treap来维护区间的哈希值。
一次修改\(O(\log n)\),一次询问\(O(\log^2 n)\)。
bzoj时限略卡,用了自然溢出才过。
#include<bits/stdc++.h>
using namespace std;
#define Bse 19260817u
unsigned Pow[]; char Str[];
int N,Q;
int ls[],rs[],siz[],pri[],val[],cnt,Root;
unsigned ha[]; unsigned ran(){static unsigned x=;return x^=x<<,x^=x>>,x^=x<<;} void combine(int id){
siz[id]=siz[ls[id]]++siz[rs[id]];
ha[id]=Pow[siz[rs[id]]+]*ha[ls[id]]+Pow[siz[rs[id]]]*val[id]+ha[rs[id]];
} int Merge(int rt1,int rt2){
if(!rt1) return rt2;
if(!rt2) return rt1;
if(pri[rt1]>=pri[rt2]){
rs[rt1]=Merge(rs[rt1],rt2);
combine(rt1);
return rt1;
}
else{
ls[rt2]=Merge(rt1,ls[rt2]);
combine(rt2);
return rt2;
}
} void Split(int rt,int k,int&rt1,int&rt2){
if(!rt) {rt1=rt2=; return;}
if(k<=siz[ls[rt]]){
Split(ls[rt],k,rt1,rt2);
ls[rt]=rt2;
combine(rt);
rt2=rt;
}
else{
Split(rs[rt],k-siz[ls[rt]]-,rt1,rt2);
rs[rt]=rt1;
combine(rt);
rt1=rt;
}
} void Insert(int pos,int v){
val[++cnt]=v, ha[cnt]=v, pri[cnt]=ran(), siz[cnt]=;
int rt1,rt2;
Split(Root,pos,rt1,rt2);
Root=Merge(Merge(rt1,cnt),rt2);
} void Change(int pos,int v){
int rt1,rt2,rt3,rt4;
Split(Root,pos-,rt1,rt2);
Split(rt2,,rt3,rt4);
val[rt3]=v; combine(rt3);
Root=Merge(Merge(rt1,rt3),rt4);
} unsigned chk(int pos,int len){
int rt1,rt2,rt3,rt4;
Split(Root,pos-,rt1,rt2);
Split(rt2,len,rt3,rt4);
unsigned D=ha[rt3];
Root=Merge(Merge(rt1,rt3),rt4);
return D;
} int main(){
Pow[]=; for(int i=;i<=;++i) Pow[i]=Pow[i-]*Bse;
scanf("%s",Str+);
N=strlen(Str+);
for(int i=;i<=N;++i)
Insert(i-,Str[i]);
scanf("%d",&Q);
for(int i=;i<=Q;++i){
int x,y; char opt[];
scanf("%s",opt);
if(*opt=='Q'){
scanf("%d%d",&x,&y);
int l=, r=N-max(x,y)+, mid, ans=;
while(l<=r){
mid=l+r>>;
if(chk(x,mid)==chk(y,mid)) ans=mid, l=mid+;
else r=mid-;
}
printf("%d\n",ans);
}
else if(*opt=='R'){
scanf("%d%s",&x,opt);
Change(x,*opt);
}
else if(*opt=='I'){
scanf("%d%s",&x,opt);
Insert(x,*opt);
++N;
}
}
return ;
} // luogu P4036 - Fhq-Treap + hash. 18:20 ~ 19:03
bzoj 1014: 洛谷 P4036: [JSOI2008]火星人的更多相关文章
- 洛谷 P4036 [JSOI2008]火星人(splay+字符串hash)
题面 洛谷 题解 首先,我们知道求最长公共前缀可以用二分答案+hash来求 因为有修改操作, 考虑将整个字符串的hash值放入splay中 接着就是splay的基本操作了 Code #include& ...
- 洛谷 P1198 [JSOI2008]最大数
洛谷 P1198 [JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. ...
- [BZOJ 3039&洛谷P4147]玉蟾宫 题解(单调栈)
[BZOJ 3039&洛谷P4147]玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. ...
- 洛谷P1198 [JSOI2008]最大数(单点修改,区间查询)
洛谷P1198 [JSOI2008]最大数 简单的线段树单点问题. 问题:读入A和Q时,按照读入一个字符会MLE,换成读入字符串就可以了. #include<bits/stdc++.h> ...
- P4036 [JSOI2008]火星人(splay+hash+二分)
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$ ...
- 「线段树」「单点修改」洛谷P1198 [JSOI2008]最大数
「线段树」「单点修改」洛谷P1198 [JSOI2008]最大数 题面描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数, ...
- 洛谷P1198 [JSOI2008]最大数(BZOJ.1012 )
To 洛谷.1198 最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当 ...
- 洛谷P1198 [JSOI2008]最大数
P1198 [JSOI2008]最大数 267通过 1.2K提交 题目提供者该用户不存在 标签线段树各省省选 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 WA80的戳这QwQ BZOJ都 ...
- BZOJ1015或洛谷1197 [JSOI2008]星球大战
BZOJ原题链接 洛谷原题链接 发现正着想毫无思路,所以我们可以考虑倒着思考,把摧毁变成建造. 这样很容易想到用并查集来维护连通块,问题也变的很简单了. 建原图,先遍历一遍所有边,若某条边的两端点未被 ...
随机推荐
- Visual Studio Code运行Python文件出现 “Linter pylint is not installed ”提示解决办法
运行Python代码后出现 “Linter pylint is not installed ”提示 只需要添加一行代码就可以解决 { "python.pythonPath": &q ...
- BZOJ5105 CodePlus2017晨跑
这个题???我WA了两发??? #include<iostream> #include<cstdio> #include<cmath> #include<cs ...
- ML科普向
转载自http://www.cnblogs.com/qscqesze/ Basis(基础): MSE(Mean Square Error 均方误差),LMS(LeastMean Square 最小均方 ...
- UIScrollView浏览一组图片,且图片与图片之间有间隔
---恢复内容开始--- UIScrollView是可以浏览一组view的,只要将其属性 pagingEnabled设置为true就可以了.具体过程是这样的, 1:将一组图片按照从左到右的顺序添加到U ...
- C++模板源代码的三种组织方式
模板代码和非模板代码是有区别的,如果像非模板代码那样把模板的声明放在头文件.h中,把模板的定义放在源文件.cpp中,那么使用这个模板时会得到一个链接错误.这个错误的原因在于,模板的定义还没有被实例化. ...
- 【poj3016】 K-Monotonic
http://poj.org/problem?id=3016 (题目链接) 题意 给出一个数列,将一个数${a_i}$更改为${b_i}$的代价为${|a_i-b_i|}$.求将数列改为不递减的最小代 ...
- 关于Powershell对抗安全软件(转)
Windows PowerShell的强大,并且内置,在渗透过程中,也让渗透变得更加有趣.而安全软件的对抗查杀也逐渐开始针对powershell的一切行为.在https://technet.micro ...
- 20135306 2.4 ELF文件格式分析
2.4 ELF文件格式分析 20135306 黄韧 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目标 ...
- MySQL基本了解与使用
MySQL的相关概念介绍 MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格 ...
- 从function的定义看JavaScript的预加载
在JavaScript中定义一个函数,有两种写法: function ftn(){} // 第一种 var ftn = function(){} // 第二种 有人说,这两种写法是完全等价的.但是在解 ...