【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] ...
随机推荐
- HTML5常用知识点
github代码:https://github.com/showkawa/H5C3/tree/master/html5 1.自定义属性 data- 1.1 可以给html里的所有DOM对象都可以添加一 ...
- Android 性能优化(12)网络优化( 8)Monitoring the Battery Level and Charging State
Monitoring the Battery Level and Charging State PreviousNext This lesson teaches you to Determine th ...
- 内联标签------------大多数XHTML可以表示为两种类型的标签:块标签(block tag)和内联标签(inline tag)
内联标签 <em> 强调,大部分浏览器渲染为斜体. <strong> 强调,大部分浏览器渲染为黑体. <sub> 下标 <sup> 上标 内联标签通常用 ...
- C# 传值和传引用 ( ref out in )
引用类型的变量不直接包含其数据:它包含的是对其数据的引用.当通过值传递引用类型的参数时,有可能更改引用所指向的数据,如某类成员的值(更改属性的值),但是无法更改引用本身的值:也就是说,不能使用相同的引 ...
- java性能优化读书笔记(1)
1.采用clone()方式创建对象 java语言里面的所有类都默认继承自java.lang.Object,此类里有一个clone()方法: 拷贝对象返回的是一个新的对象,而不是一个对象的引用地址: 拷 ...
- java IO流 之 字节输出流 OutputString()
Java学习重点之一:OutputStream 字节输出流的使用 FileOutPutStream:子类,写出数据的通道 步骤: 1.获取目标文件 2.创建通道(如果原来没有目标文件,则会自动创建一个 ...
- 使用Micrisoft.net设计方案 第三章Web表示模式 Web模式集群详细介绍 Observer(观察器)
在面向对象的编程中,对象同时包含数据和行为,这两者一起表示业务域的特定方面.使用对象生成应用程序的优点之一是可以将所有数据操作封装在对象内.这样, 就使对象成为独立的单位,并增加了在其他应用程序中重用 ...
- Detectron:Pytorch-Caffe2-Detectron的一些跟进
pytorch官网:http://pytorch.org/上只有PyTroch的ubuntu和Mac版本,赤裸裸地歧视了一把Windows低端用户. 1. Caffe源码:Caffe源 ...
- PHP引用(&)的考察点
引用的概念 在PHP中引用意味着用不同的名字访问同一个变量内容. 定义方式 使用 & 符号来表示 变量的引用 $a = 'ABC'; //开辟一块内存空间存储数据,$a指向该空间 $b = & ...
- HTML 5 <aside> 标签
定义和用法 <aside> 标签定义 article 以外的内容.aside 的内容应该与 article 的内容相关. 实例 <p>Me and my family visi ...