BZOJ 1014 [JSOI2008]火星人prefix | Splay维护哈希值
2024-09-07 03:56:47
题目:
题解:
#include<cstdio>
#include<algorithm>
#include<cstring>
typedef long long ll;
#define N 100010
#define Base 29
#define which(x) (ls[fa[(x)]]==(x))
using namespace std;
int n,m,idx,root,fa[N],ls[N],rs[N],val[N],sz[N],a,b;
ll hsh[N],pw[N];
char s[N],op[];
void upt(int u)
{
sz[u]=sz[ls[u]]+sz[rs[u]]+;
hsh[u]=hsh[ls[u]]+val[u]*pw[sz[ls[u]]]+hsh[rs[u]]*pw[sz[ls[u]]+];
}
void rotate(int u)
{
int v=fa[u],w=fa[v],b=which(u)?rs[u]:ls[u];
if (w) which(v)?ls[w]=u:rs[w]=u;
which(u)?(ls[v]=b,rs[u]=v):(rs[v]=b,ls[u]=v);
fa[u]=w,fa[v]=u;
if (b) fa[b]=v;
upt(v),upt(u);
}
void splay(int u,int tar)
{
while (fa[u]!=tar)
{
if (fa[fa[u]]!=tar)
(which(u)==which(fa[u]))?rotate(fa[u]):rotate(u);
rotate(u);
}
if (!tar) root=u;
}
int build(int l,int r,int pre)
{
if (l>r) return ;
int u=++idx,mid=l+r>>;
val[u]=s[mid]-'a'+,fa[u]=pre;
ls[u]=build(l,mid-,u);
rs[u]=build(mid+,r,u);
upt(u);
return u;
}
int find(int x)
{
int u=root;
while(sz[ls[u]]!=x)
if (x<=sz[ls[u]]-) u=ls[u];
else x-=sz[ls[u]]+,u=rs[u];
return u;
}
void insert(int pos,int x)
{
int u=find(pos),v=find(pos+);
splay(u,),splay(v,u);
ls[v]=++idx,fa[idx]=v,val[idx]=x,sz[idx]=;
splay(idx,);
}
void change(int pos,int x)
{
int u=find(pos);
val[u]=x;
splay(u,);
}
ll gethsh(int pos,int len)
{
int u=find(pos-),v=find(pos+len);
splay(u,),splay(v,u);
return hsh[ls[v]];
}
int query(int a,int b)
{
int l=,r=sz[root]-max(a,b)-,mid;
while (l<r)
{
mid=l+r+>>;
if (gethsh(a,mid)==gethsh(b,mid)) l=mid;
else r=mid-;
}
return l;
}
int main()
{
scanf("%s",s+);
n=strlen(s+);
pw[]=;
for (int i=;i<N;i++)
pw[i]=pw[i-]*Base;
root=build(,n+,);
scanf("%d",&m);
while (m--)
{
scanf("%s",op);
if (op[]=='Q')
{
scanf("%d%d",&a,&b);
printf("%d\n",query(a,b));
}
else if (op[]=='I')
{
int pos;
scanf("%d%s",&pos,op);
insert(pos,op[]-'a'+);
}
else if (op[]=='R')
{
int pos;
scanf("%d%s",&pos,op);
change(pos,op[]-'a'+);
}
}
return ;
}
最新文章
- hdu1260 dp
- form表单修改label样式
- 利用background-attachment做视差滚动效果
- Leetcode 257 Binary Tree Paths 二叉树 DFS
- Redis 笔记与总结3 list 类型
- JavaWeb项目的classpath说明
- 开发Nginx模块
- ROS理解roslaunch命令
- gitlab 升级
- linux之hdparm命令说明及其测试硬盘读写速度
- 树莓派连接不上WiFi
- kibana get 查询失效
- VNC安装配置
- 【Wannafly挑战赛14C可达性】【Tarjan缩点】
- Java_5.2 数组应用:*的打印
- C#读写基恩士PLC 使用TCP/IP 协议 MC协议
- 设置zedgraph鼠标拖拽和局部放大属性(转帖)
- SpringMVC零碎笔记
- Exp6 信息搜集与漏洞扫描 20164323段钊阳
- numpy数组广播
热门文章
- Ubuntu安装MySQL及使用Xshell连接MySQL出现的问题(2003-Can&#39;t connect to MySql server及1045错误)
- PHP中json_encode后,在json字符串中依然显示中文的解决方案
- php-5.6.26源代码 - opcode执行
- flask-login原理详解
- ERROR 1005 (HY000): Can't create table 'students.#sql-d9
- openwrt(一):openwrt源码下载及编译环境搭建
- 5,pandas高级数据处理
- CF6C Alice, Bob and Chocolate
- Eclipse 修改字符集---Eclipse教程第02课
- __bridge 使用注意