bzoj 1014: 洛谷 P4036: [JSOI2008]火星人
题目传送门:洛谷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]火星人相关推荐
- 洛谷 p1197 [JSOI2008]星球大战(并查集)
洛谷 P1197 [JSOI2008]星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了 ...
- 洛谷P4037 [JSOI2008]魔兽地图 题解
洛谷P4037 [JSOI2008]魔兽地图 题解 题目链接:P4037 [JSOI2008]魔兽地图 题意: DotR (Defense of the Robots) Allstars是一个风靡全球 ...
- 洛谷P1198 [JSOI2008]最大数
P1198 [JSOI2008]最大数 267通过 1.2K提交 题目提供者该用户不存在 标签线段树各省省选 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 WA80的戳这QwQ BZOJ都 ...
- #莫比乌斯反演#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 ...
- BZOJ 4385 洛谷3594 POI2015 WIL-Wilcze doły
[题解] 手残写错调了好久QAQ...... 洛谷的数据似乎比较水.. n个正整数!!这很重要 这道题是个类似two pointer的思想,外加一个单调队列维护当前区间内长度为d的子序列中元素之和的最 ...
- 洛谷 P1197 [JSOI2008]星球大战
题意简述 有n个点和m条通道, 现在按顺序破坏k个点 求每一次破坏后联通块的个数 题解思路 并查集,逆序做, 先假设给的k个星球全都被炸,求出此时的联通块个数,就是经过k次打击的联通块个数. 然后每次 ...
- BZOJ 3720 [洛谷P2137] : Gty的妹子树
Description 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕-- Gty神(xian)犇(chong)从来不缺妹子-- 他来到了一棵妹子树下,发现每 ...
- BZOJ 2733 | 洛谷 P3224 [HNOI2012]永无乡
https://www.lydsy.com/JudgeOnline/problem.php?id=2733 https://www.luogu.org/problemnew/show/P3224 C+ ...
- bzoj 2653 洛谷 P2839 [国家集训队] middle
2653: middle Time Limit: 20 Sec Memory Limit: 512 MB Submit: 2381 Solved: 1340 [Submit][Status][Di ...
- 洛谷 P4208 [JSOI2008]最小生成树计数 矩阵树定理
题目描述 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的).由于不同的 ...
最新文章
- Python字典理解
- 【COGS】2287:[HZOI 2015]疯狂的机器人 FFT+卡特兰数+排列组合
- muduo之AsyncLogging
- vue 订单支付15分钟倒计时
- 在html中取消或加上超链接的下划线
- POJ 3280 Cheapest Palindrome
- [开源] 基于ABP,Hangfire的开源Sharepoint文件同步解决方案----SuperRocket.SPSync
- 如何在php中插入数据并修改,php怎么同时向2张表里插入数据
- Particle Filter Tutorial 粒子滤波:从推导到应用(三)
- Java - Java Mail邮件开发(3)spring +Java Mail + Velocity
- AutoCAD-源泉设计-利器
- linux+极点五笔输入法,Linux技巧之Ubuntu11.04下安装极点五笔输入法
- Lenovo笔记本BIOS详解
- 阳性水草与阴性水草的区分
- 用计算机制作演示文稿教案博客,《创作演示文稿》教学设计
- Region Proposal by Guided Anchoring 阅读笔记
- Linux中常见的ping不通百度问题
- iClap:产品经理再忙也要看《琅琊榜》
- hihoCoder - 1633(2017北京icpc现场赛-G题)
- 台式机是计算机进入睡眠状态,电脑如何进入睡眠状态_电脑如何设置自动睡眠...