题目大意
给你一个字符串,初始长度为len,还有一个n个元素的序列P。接下来m个操作,有三种类型,分别是:
1. 在字符串前面加入一个字符
2. 修改P中一个元素的值
3. 询问对于所有i∈[l,r],S[L-P[i]+1..L]字典序最小的i(有多个则输出最小的i,L是当前字符串长度)
Data Constraint
对于 100% 的数据, 1≤n≤500000, 1≤m≤800000,1≤Pi≤len≤ 100000。
修改操作中 1 ≤ x ≤ n, 1 ≤ pos ≤ 当前字符串长度。
询问操作中 1 ≤ l, r ≤ n,插入操作数量约占总操作数量的 1/5,修改、询问操作数量约各占总操作数量的2/5。
分析
首先要考虑维护每个后缀的排名,然后还要是在线的算法,支持在线插入。这个是后缀数组、后缀自动机难以实现的。
所以可以考虑使用后缀平衡树。
如果使用后缀平衡树,那么这就是裸题。用线段树维护P数组区间最小的后缀。由于只有插入操作,刚刚执行插入一个新后缀的操作后,P数组没有一个元素和这个后缀对应,所以不用给线段树做任何操作。
修改和询问就是简单的线段树操作了。
时间复杂度 O(mlogn)
/**************************************************************
Problem: 3682
User: worldwide
Language: C++
Result: Accepted
T