题目:


题解:

#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 ;
}

最新文章

  1. hdu1260 dp
  2. form表单修改label样式
  3. 利用background-attachment做视差滚动效果
  4. Leetcode 257 Binary Tree Paths 二叉树 DFS
  5. Redis 笔记与总结3 list 类型
  6. JavaWeb项目的classpath说明
  7. 开发Nginx模块
  8. ROS理解roslaunch命令
  9. gitlab 升级
  10. linux之hdparm命令说明及其测试硬盘读写速度
  11. 树莓派连接不上WiFi
  12. kibana get 查询失效
  13. VNC安装配置
  14. 【Wannafly挑战赛14C可达性】【Tarjan缩点】
  15. Java_5.2 数组应用:*的打印
  16. C#读写基恩士PLC 使用TCP/IP 协议 MC协议
  17. 设置zedgraph鼠标拖拽和局部放大属性(转帖)
  18. SpringMVC零碎笔记
  19. Exp6 信息搜集与漏洞扫描 20164323段钊阳
  20. numpy数组广播

热门文章

  1. Ubuntu安装MySQL及使用Xshell连接MySQL出现的问题(2003-Can&#39;t connect to MySql server及1045错误)
  2. PHP中json_encode后,在json字符串中依然显示中文的解决方案
  3. php-5.6.26源代码 - opcode执行
  4. flask-login原理详解
  5. ERROR 1005 (HY000): Can't create table 'students.#sql-d9
  6. openwrt(一):openwrt源码下载及编译环境搭建
  7. 5,pandas高级数据处理
  8. CF6C Alice, Bob and Chocolate
  9. Eclipse 修改字符集---Eclipse教程第02课
  10. __bridge 使用注意