【BZOJ1014】火星人prefix(splay,Hash)
题意:
、
思路:
const mo=;
var t:array[..,..]of longint;
sum,size,fa,a,b,id,mi:array[..]of longint;
n,m,i,x,y,s,k,j,cnt,root:longint;
ch:ansistring; procedure swap(var x,y:longint);
var t:longint;
begin
t:=x; x:=y; y:=t;
end; procedure pushup(x:longint);
var l,r:longint;
begin
l:=t[x,]; r:=t[x,];
size[x]:=size[l]+size[r]+;
sum[x]:=(sum[l]+int64(mi[size[l]])*b[x]+int64(mi[size[l]+])*sum[r]) mod mo;
// sum[x]:=(sum[r]+int64(mi[size[r]])*b[x]+int64(mi[size[r]+])*sum[l]) mod mo; 也可以
end; function min(x,y:longint):longint;
begin
if x<y then exit(x);
exit(y);
end; procedure rotate(x:longint;var k:longint);
var y,z,l,r:longint;
begin
y:=fa[x]; z:=fa[y];
if t[y,]=x then l:=
else l:=;
r:=l xor ;
if y<>k then
begin
if t[z,]=y then t[z,]:=x
else t[z,]:=x;
end
else k:=x;
fa[x]:=z; fa[y]:=x; fa[t[x,r]]:=y;
t[y,l]:=t[x,r]; t[x,r]:=y;
pushup(y);
pushup(x);
end; procedure splay(x:longint;var k:longint);
var y,z:longint;
begin
while x<>k do
begin
y:=fa[x]; z:=fa[y];
if y<>k then
begin
if (t[y,]=x)xor(t[z,]=y) then rotate(x,k)
else rotate(y,k);
end
else k:=x;
rotate(x,k);
end;
end; procedure build(l,r,x:longint);
var mid,now,last:longint;
begin
if l>r then exit;
now:=id[l]; last:=id[x];
if l=r then
begin
sum[now]:=a[now]; b[now]:=a[now];
fa[now]:=last; size[now]:=;
if l<x then t[last,]:=now
else t[last,]:=now;
exit;
end;
mid:=(l+r)>>; now:=id[mid];
build(l,mid-,mid);
build(mid+,r,mid);
b[now]:=a[mid]; fa[now]:=last;
pushup(now);
if mid<x then t[last,]:=now
else t[last,]:=now;
end; function kth(x:longint):longint;
var k,tmp:longint;
begin
k:=root;
while k<> do
begin
tmp:=size[t[k,]]+;
if tmp=x then exit(k);
if tmp>x then k:=t[k,]
else
begin
x:=x-tmp;
k:=t[k,];
end;
end;
end; function query(k,tot:longint):longint;
var x,y:longint;
begin
x:=kth(k); y:=kth(k+tot+);
splay(x,root);
splay(y,t[x,]);
exit(sum[t[y,]]);
end; function ask(x,y:longint):longint;
var l,r,mid,last:longint;
begin
l:=; r:=min(cnt-x,cnt-y)-; last:=;
while l<=r do
begin
mid:=(l+r)>>;
if query(x,mid)=query(y,mid) then begin last:=mid; l:=mid+; end
else r:=mid-;
end;
exit(last);
end; procedure ins(x,y:longint);
var p,q,z:longint;
begin
p:=kth(x+);
q:=kth(x+);
splay(p,root);
splay(q,t[p,]);
inc(cnt); z:=cnt; t[q,]:=z;
fa[z]:=q; b[z]:=y;
pushup(z);
pushup(q);
pushup(p);
end; begin readln(ch);
n:=length(ch);
for i:= to n+ do a[i]:=ord(ch[i-])-ord('a')+;
mi[]:=;
for i:= to do mi[i]:=mi[i-]* mod mo;
for i:= to n+ do id[i]:=i;
build(,n+,); root:=(n+)>>; cnt:=n+;
readln(m);
for i:= to m do
begin
readln(ch); k:=length(ch); s:=; x:=; y:=;
for j:= to k do
begin
if ch[j]=' ' then begin inc(s); continue; end;
if s= then x:=x*+ord(ch[j])-ord('');
if s= then y:=y*+ord(ch[j])-ord('');
end;
if ch[]='Q' then writeln(ask(x,y));
if ch[]='R' then
begin
y:=y+ord('')-ord('a')+;
k:=kth(x+); splay(k,root);
b[k]:=y; pushup(root);
end;
if ch[]='I' then
begin
y:=y+ord('')-ord('a')+;
ins(x,y);
end;
end; end.
【BZOJ1014】火星人prefix(splay,Hash)的更多相关文章
- 【BZOJ1014】[JSOI2008]火星人prefix Splay+hash
[BZOJ1014][JSOI2008]火星人prefix Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个 ...
- 【bzoj1014】[JSOI2008]火星人prefix Splay+Hash+二分
题目描述 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 8 9 10 ...
- BZOJ 1014: [JSOI2008]火星人prefix( splay + hash )
用splay维护序列, 二分+hash来判断LCQ.. #include<bits/stdc++.h> using namespace std; typedef unsigned long ...
- BZOJ 1014 [JSOI2008]火星人prefix (Splay + Hash + 二分)
1014: [JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 8112 Solved: 2569[Submit] ...
- bzoj1014: [JSOI2008]火星人prefix splay+hash+二分
Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 ...
- bzoj1014: [JSOI2008]火星人prefix splay+hash
我写的代码好像自古以来就是bzoj不友好型的 本地跑的比std快,但是交上去巧妙被卡 答案...应该是对的,拍了好久了 #include <bits/stdc++.h> #define M ...
- BZOJ1014火星人prefix Splay維護序列 + 字符串哈希
@[Splay, 哈希] Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:\(madamimadam\), 我们将这个字符串的各个字符予以标号 ...
- $bzoj1014-JSOI2008$ 火星人$prefix$ $splay$ $hash$
题面描述 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:\(madamimadam\),我们将这个字符串的各个字符予以标号: 序号 1 2 3 4 5 6 7 8 ...
- bzoj 1014 火星人prefix —— splay+hash
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1014 用 splay 维护字符串上不同位置的哈希值还是第一次... 具体就是每个节点作为位置 ...
- 【BZOJ-1014】火星人prefix Splay + 二分 + Hash
1014: [JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5852 Solved: 1871[Submit] ...
随机推荐
- robotframework - User key 操作
一.用户关键字操作思路 a.创建model1资源 b.在model下创建用户关键字 - 循环 c.测试套件下创建test_case/case2 & 用户关键字 d.测试套件中导入Resourc ...
- 例题 5-1 STL
Raju and Meena love to play with Marbles. They have got a lot of marbles with numbers written on the ...
- c++病毒函数
FreeConsole(); 屏蔽输出. BlockInput(); 阻止键盘和鼠标的工作. 所需头文件: #include <windows.h> #include <Winabl ...
- 二分查找 HDOJ 2141 Can you find it?
题目传送门 /* 题意:给出一个数,问是否有ai + bj + ck == x 二分查找:首先计算sum[l] = a[i] + b[j],对于q,枚举ck,查找是否有sum + ck == x */ ...
- jquery.autocomplete.js用法及示例,小白进
8 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 ...
- 24 C#的类和对象
类是C#面向对象编程的基本单元.一个类都可以包含2种成员:字段和方法. 1)类的字段代表类中被处理的数据(变量): 2)类的方法代表对这些数据的处理过程或用于实现某种特定的功能,方法中的代码往往需 ...
- Spring Boot (28) actuator与spring-boot-admin
在上一篇中,通过restful api的方式查看信息过于繁琐,也不直观,效率低下.当服务过多的时候看起来就过于麻烦,每个服务都需要调用不同的接口来查看监控信息. SBA SBA全称spring boo ...
- duilib入门问题集
问:如何把资源放入zip?答: 先SetResourcePath设置资源目录,再SetResourceZip设置压缩资源文件名 问:如何设置窗体的初始化大小?答:设置XML文件的Window标签的si ...
- 继承static的注意点
继承static的注意点 singleton模式会使用 <?php class Auth { protected static $_instance = null; /** * 单用例入口 * ...
- 导出数据到Excel表格
开发工具与关键技术:Visual Studio 和 ASP.NET.MVC,作者:陈鸿鹏撰写时间:2019年5月25日123下面是我们来学习的导出数据到Excel表格的总结首先在视图层写导出数据的点击 ...