[bzoj3682]Phorni

题目大意

给你一个字符串,初始长度为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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值