题目传送门:洛谷P4036。

题意简述:

有一个字符串,支持插入字符,修改字符。

每次需要查询两个后缀的LCP长度。

最终字符串长度\(\le 100,\!000\),修改和询问的总个数\(\le 150,\!000\),查询操作\(\le 10,\!000\)。

题解:

由后缀和LCP可以想到后缀数组或后缀自动机,但是它们都无法插入或修改。

考虑到LCP可以通过二分+哈希的方式来计算,考虑维护区间的哈希值。

这里使用平衡树无旋Treap来维护区间的哈希值。

一次修改\(O(\log n)\),一次询问\(O(\log^2 n)\)。

bzoj时限略卡,用了自然溢出才过。

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 #define Bse 19260817u
  4 unsigned Pow[100005];
  5
  6 char Str[100005];
  7 int N,Q;
  8 int ls[100005],rs[100005],siz[100005],pri[100005],val[100005],cnt,Root;
  9 unsigned ha[100005];
 10
 11 unsigned ran(){static unsigned x=23333;return x^=x<<13,x^=x>>17,x^=x<<5;}
 12
 13 void combine(int id){
 14     siz[id]=siz[ls[id]]+1+siz[rs[id]];
 15     ha[id]=Pow[siz[rs[id]]+1]*ha[ls[id]]+Pow[siz[rs[id]]]*val[id]+ha[rs[id]];
 16 }
 17
 18 int Merge(int rt1,int rt2){
 19     if(!rt1) return rt2;
 20     if(!rt2) return rt1;
 21     if(pri[rt1]>=pri[rt2]){
 22         rs[rt1]=Merge(rs[rt1],rt2);
 23         combine(rt1);
 24         return rt1;
 25     }
 26     else{
 27         ls[rt2]=Merge(rt1,ls[rt2]);
 28         combine(rt2);
 29         return rt2;
 30     }
 31 }
 32
 33 void Split(int rt,int k,int&rt1,int&rt2){
 34     if(!rt) {rt1=rt2=0; return;}
 35     if(k<=siz[ls[rt]]){
 36         Split(ls[rt],k,rt1,rt2);
 37         ls[rt]=rt2;
 38         combine(rt);
 39         rt2=rt;
 40     }
 41     else{
 42         Split(rs[rt],k-siz[ls[rt]]-1,rt1,rt2);
 43         rs[rt]=rt1;
 44         combine(rt);
 45         rt1=rt;
 46     }
 47 }
 48
 49 void Insert(int pos,int v){
 50     val[++cnt]=v, ha[cnt]=v, pri[cnt]=ran(), siz[cnt]=1;
 51     int rt1,rt2;
 52     Split(Root,pos,rt1,rt2);
 53     Root=Merge(Merge(rt1,cnt),rt2);
 54 }
 55
 56 void Change(int pos,int v){
 57     int rt1,rt2,rt3,rt4;
 58     Split(Root,pos-1,rt1,rt2);
 59     Split(rt2,1,rt3,rt4);
 60     val[rt3]=v; combine(rt3);
 61     Root=Merge(Merge(rt1,rt3),rt4);
 62 }
 63
 64 unsigned chk(int pos,int len){
 65     int rt1,rt2,rt3,rt4;
 66     Split(Root,pos-1,rt1,rt2);
 67     Split(rt2,len,rt3,rt4);
 68     unsigned D=ha[rt3];
 69     Root=Merge(Merge(rt1,rt3),rt4);
 70     return D;
 71 }
 72
 73 int main(){
 74     Pow[0]=1; for(int i=1;i<=100000;++i) Pow[i]=Pow[i-1]*Bse;
 75     scanf("%s",Str+1);
 76     N=strlen(Str+1);
 77     for(int i=1;i<=N;++i)
 78         Insert(i-1,Str[i]);
 79     scanf("%d",&Q);
 80     for(int i=1;i<=Q;++i){
 81         int x,y; char opt[5];
 82         scanf("%s",opt);
 83         if(*opt=='Q'){
 84             scanf("%d%d",&x,&y);
 85             int l=1, r=N-max(x,y)+1, mid, ans=0;
 86             while(l<=r){
 87                 mid=l+r>>1;
 88                 if(chk(x,mid)==chk(y,mid)) ans=mid, l=mid+1;
 89                 else r=mid-1;
 90             }
 91             printf("%d\n",ans);
 92         }
 93         else if(*opt=='R'){
 94             scanf("%d%s",&x,opt);
 95             Change(x,*opt);
 96         }
 97         else if(*opt=='I'){
 98             scanf("%d%s",&x,opt);
 99             Insert(x,*opt);
100             ++N;
101         }
102     }
103     return 0;
104 }
105
106 // luogu P4036 - Fhq-Treap + hash. 18:20 ~ 19:03

转载于:https://www.cnblogs.com/PinkRabbit/p/9581990.html

bzoj 1014: 洛谷 P4036: [JSOI2008]火星人相关推荐

  1. 洛谷 p1197 [JSOI2008]星球大战(并查集)

    洛谷 P1197 [JSOI2008]星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了 ...

  2. 洛谷P4037 [JSOI2008]魔兽地图 题解

    洛谷P4037 [JSOI2008]魔兽地图 题解 题目链接:P4037 [JSOI2008]魔兽地图 题意: DotR (Defense of the Robots) Allstars是一个风靡全球 ...

  3. 洛谷P1198 [JSOI2008]最大数

    P1198 [JSOI2008]最大数 267通过 1.2K提交 题目提供者该用户不存在 标签线段树各省省选 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 WA80的戳这QwQ BZOJ都 ...

  4. #莫比乌斯反演#BZOJ 2671 洛谷 4466 和与积 Calc

    题目 求有多少对(a,b)(a,b)(a,b)满足1≤a<b≤n1\leq a<b\leq n1≤a<b≤n且a+b∣aba+b|aba+b∣ab 分析 若gcd(a,b)=1gcd ...

  5. BZOJ 4385 洛谷3594 POI2015 WIL-Wilcze doły

    [题解] 手残写错调了好久QAQ...... 洛谷的数据似乎比较水.. n个正整数!!这很重要 这道题是个类似two pointer的思想,外加一个单调队列维护当前区间内长度为d的子序列中元素之和的最 ...

  6. 洛谷 P1197 [JSOI2008]星球大战

    题意简述 有n个点和m条通道, 现在按顺序破坏k个点 求每一次破坏后联通块的个数 题解思路 并查集,逆序做, 先假设给的k个星球全都被炸,求出此时的联通块个数,就是经过k次打击的联通块个数. 然后每次 ...

  7. BZOJ 3720 [洛谷P2137] : Gty的妹子树

    Description 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕-- Gty神(xian)犇(chong)从来不缺妹子-- 他来到了一棵妹子树下,发现每 ...

  8. BZOJ 2733 | 洛谷 P3224 [HNOI2012]永无乡

    https://www.lydsy.com/JudgeOnline/problem.php?id=2733 https://www.luogu.org/problemnew/show/P3224 C+ ...

  9. bzoj 2653 洛谷 P2839 [国家集训队] middle

    2653: middle Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 2381  Solved: 1340 [Submit][Status][Di ...

  10. 洛谷 P4208 [JSOI2008]最小生成树计数 矩阵树定理

    题目描述 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的).由于不同的 ...

最新文章

  1. Python字典理解
  2. 【COGS】2287:[HZOI 2015]疯狂的机器人 FFT+卡特兰数+排列组合
  3. muduo之AsyncLogging
  4. vue 订单支付15分钟倒计时
  5. 在html中取消或加上超链接的下划线
  6. POJ 3280 Cheapest Palindrome
  7. [开源] 基于ABP,Hangfire的开源Sharepoint文件同步解决方案----SuperRocket.SPSync
  8. 如何在php中插入数据并修改,php怎么同时向2张表里插入数据
  9. Particle Filter Tutorial 粒子滤波:从推导到应用(三)
  10. Java - Java Mail邮件开发(3)spring +Java Mail + Velocity
  11. AutoCAD-源泉设计-利器
  12. linux+极点五笔输入法,Linux技巧之Ubuntu11.04下安装极点五笔输入法
  13. Lenovo笔记本BIOS详解
  14. 阳性水草与阴性水草的区分
  15. 用计算机制作演示文稿教案博客,《创作演示文稿》教学设计
  16. Region Proposal by Guided Anchoring 阅读笔记
  17. Linux中常见的ping不通百度问题
  18. iClap:产品经理再忙也要看《琅琊榜》
  19. hihoCoder - 1633(2017北京icpc现场赛-G题)
  20. 台式机是计算机进入睡眠状态,电脑如何进入睡眠状态_电脑如何设置自动睡眠...

热门文章

  1. 快速开发和设计的8个黄金法则
  2. BitPlots包简介
  3. 神剧《切尔诺贝利》引发的技术思考:如何避免下一次核灾难?
  4. R语言ETL系列:过滤(filter)
  5. js先执行一个方法再往下执行_轻松理解JS中的面向对象,顺便搞懂prototype和__proto__...
  6. spring-boot基础知识
  7. 关于MySQL latch争用深入分析与判断
  8. Deep Learning 深度学习 学习教程网站集锦
  9. 分布式系统的数据一致性问题
  10. 项目开发经常使用PHP功能