#include <bits/stdc++.h>
#define int long long
using namespace std;
int len;
int m;
int rt = 0;
int has[1000010];
void init()
{
srand(1);
has[0] = 1;
for(int i = 1;i <= 1000000;i++)
has[i] = has[i - 1] * 101;
//cout << has[] << endl;
}
char s[1000010];
struct edge
{
int val;
int lson;
int s;
int rson;
int kth;
int siz;
}e[1000010];
int cnt = 0;
int newnode(int xx)
{
e[++cnt].val = xx;
e[cnt].kth = rand();
e[cnt].s = xx;
e[cnt].siz = 1;
return cnt;
}
void up(int x)
{
e[x].siz = e[e[x].lson].siz + e[e[x].rson].siz + 1;
e[x].s = e[e[x].lson].s * has[e[e[x].rson].siz + 1] + e[x].val * has[e[e[x].rson].siz] + e[e[x].rson].s;
}
int merge(int A,int B)
{
///cout << A << " " << B << endl;
if(!A || !B)return A + B;
if(e[A].kth < e[B].kth)
{
e[A].rson = merge(e[A].rson,B);
up(A);
return A;
}
else
{
e[B].lson = merge(A,e[B].lson);
up(B);
return B;
}
}
pair<int,int> split(int x,int val)
{
if(!x)return pair<int,int>();
///cout << x << endl;
if(val <= e[e[x].lson].siz)
{
pair<int,int> s = split(e[x].lson,val);
e[x].lson = s.second;
s.second = x;
up(x);
return s;
}
else
{
pair<int,int> s = split(e[x].rson,val - e[e[x].lson].siz - 1);
e[x].rson = s.first;
s.first = x;
up(x);
return s;
/* for(int i = 1;i <= len;i++)
{
printf("%d",f[i]);
}*/
}
}
int Has(int L,int R)
{
if(L > R)return 0;
pair<int,int> retl = split(rt,R);
pair<int,int> retr = split(retl.first,L - 1);
int res = e[retr.second].s;
retl.first = merge(retr.first,retr.second);
rt = merge(retl.first,retl.second);
///cout << L << " " << R << endl;
return res;
}
void add(int x,int val)
{
pair<int,int> retl = split(rt,x);
retl.first = merge(retl.first,newnode(val));
rt = merge(retl.first,retl.second);
len++;
}
int query(int x,int y)
{
int l = 0,r = min(len - x + 1,len - y + 1);
while(l < r)
{
//cout << l << " " << r << endl;
int mid = (l + r + 1) / 2;
if(Has(x,x + mid - 1) == Has(y,y + mid - 1))l = mid;
else r = mid - 1;
}
return l;
}
void updata1(int x,int val)
{
pair<int,int> retl = split(rt,x);
pair<int,int> retr = split(retl.first,x - 1);
e[retr.second].s = e[retr.second].val = val;
retl.first = merge(retr.first,retr.second);
rt = merge(retl.first,retl.second);
}
signed main()
{
init();
int x,y;
scanf("%s",s + 1);
scanf("%lld",&m);
len = strlen(s + 1);
for(int i = 1;i <= len;i++)
rt = merge(rt,newnode(s[i] - 'a' + 1));
for(int i = 1;i <= m;i++)
{
scanf("%s",s + 1);
if(s[1] == 'Q')
{
scanf("%lld%lld",&x,&y);
printf("%lld\n",query(x,y));
}
else if(s[1] == 'R')
{
scanf("%lld%s",&x,s + 1);
updata1(x,s[1] - 'a' + 1);
}
else
{
scanf("%lld %s",&x,s + 1);
add(x,s[1] - 'a' + 1);
}
}
return 0;
}

P4036 [JSOI2008] 火星人的更多相关文章

  1. 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$ ...

  2. bzoj 1014: 洛谷 P4036: [JSOI2008]火星人

    题目传送门:洛谷P4036. 题意简述: 有一个字符串,支持插入字符,修改字符. 每次需要查询两个后缀的LCP长度. 最终字符串长度\(\le 100,\!000\),修改和询问的总个数\(\le 1 ...

  3. luogu P4036 [JSOI2008]火星人

    传送门 很久以前xzz大佬就喊我做这题,结果现在才做qwq 因为要在序列中插入,所以直接用\(Splay\)维护这个串的哈希值,插入就直接把那个点插♂进去,修改就把点旋到根,然后修改和pushup,询 ...

  4. 洛谷 P4036 [JSOI2008]火星人(splay+字符串hash)

    题面 洛谷 题解 首先,我们知道求最长公共前缀可以用二分答案+hash来求 因为有修改操作, 考虑将整个字符串的hash值放入splay中 接着就是splay的基本操作了 Code #include& ...

  5. 1014: [JSOI2008]火星人prefix

    1014: [JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MB Description 火星人最近研究了一种操作:求一个字串两个后缀 ...

  6. [BZOJ1014][JSOI2008]火星人prefix

    [BZOJ1014][JSOI2008]火星人prefix 试题描述 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字 ...

  7. BZOJ 1014: [JSOI2008]火星人prefix [splay 二分+hash] 【未完】

    1014: [JSOI2008]火星人prefix Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6243  Solved: 2007[Submit] ...

  8. 【bzoj1014】[JSOI2008]火星人prefix

    1014: [JSOI2008]火星人prefix Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6031  Solved: 1917[Submit] ...

  9. BZOJ 1014: [JSOI2008]火星人prefix Splay+二分

    1014: [JSOI2008]火星人prefix 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1014 Description 火星人 ...

  10. JSOI2008 火星人prefix

    1014: [JSOI2008]火星人prefix Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2918  Solved: 866[Submit][ ...

随机推荐

  1. Fiddler 使用fiddler无法抓取苹果手机https请求问题解决方案

    使用fiddler无法抓取苹果手机https请求问题解决方案 by:授客 QQ:1033553122   测试环境 Win10 Fiddle4 IPhone6s 问题描述 使用fiddler抓取IPh ...

  2. iOS开发基础143-性能优化

    我们可以先构建一个详细的大纲,然后在每个部分详细阐述.下面是一个针对iOS性能优化的详细大纲: 一. App启动时间优化 A. 启动分类 冷启动 热启动 B. 冷启动优化 减少启动时的动态库加载 尽可 ...

  3. Jmeter二次开发函数之入门

    背景:Jmeter不能满足我们的参数需求,如生成手机号码.身份证号码等业务,固对jmeter进行二次函数开发. jmeter提供了接口供用户进行二次开发,我们只需引入包进行编辑.从jmeter规范上, ...

  4. 论文:使用分层强化学习进行空对空格斗(战斗机空对空搏斗)《Hierarchical Reinforcement Learning for Air-to-Air Combat》

  5. 决定了,今日起开始准备弃用京东JD

    估计京东是为了节约开支,然后开始大比例的把快递物流业务进行外包了,这直接导致服务质量的直线下滑,10多年前我选择弃用当当网而选择京东JD就是因为当时当地的当当网快递是用沈阳晚报的快递上门的,快递员连P ...

  6. 国产操作系统——银河麒麟V10 SP1使用小结

    前几天看新闻国产操作系统银河麒麟有了新的更新于是上手搞了一个. ========================================================= 该系统自带驱动,其中 ...

  7. C#.Net筑基-解密委托与事件

    委托与事件是C#中历史比较悠久的技术,从C#1.0开始就有了,核心作用就是将方法作为参数(变量)来传递和使用.其中委托是基础,需要熟练掌握,编程中常用的Lambda表达式.Action.Func都是委 ...

  8. 解密prompt系列35. 标准化Prompt进行时! DSPy论文串烧和代码示例

    一晃24年已经过了一半,我们来重新看下大模型应用中最脆弱的一环Prompt Engineering有了哪些新的解决方案.这一章我们先看看大火的DSPy框架,会先梳理DSPy相关的几篇核心论文了解下框架 ...

  9. vue之父组件与子组件的通信

    1.背景 参数传递(多理解) 1.父传子<c-parent :messagevue="message"></c-parent>,请看下面具体的截图描述 2. ...

  10. Wetab 标签页:内置多种免费实用优雅小组件的浏览器主页和起始页

    Wetab 是什么? Wetab 是一款基于浏览器的新标签页产品,主张辅助用户打造一个兼具效率与美观的主页. Wetab 的核心特色便是内置了多种实用.优雅的小组件. 今天这篇,主要按照分类详细介绍  ...