【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] ...
随机推荐
- python自动化测试学习笔记-unittest参数化
做接口测试的时候,当一个参数需要输入多个值的时候,就可以使用参数来实现: python中unittest单元测试,可以使用nose_parameterized来实现: 首先需要安装:pip inst ...
- 通过路由器的IP映射来解决,两个不同IP地址的PC机之间的从LAN口到WAN口的单向通讯问题
1.问题假设: 在B机中IP地址与子网掩码都固定,网关是路由器的LAN口的IP地址,我们希望通过路由器来实现B机与A机之间的单向通讯问题,也就是说B可以ping通A且可以访问A提供的FTP站点. 2. ...
- JavaScript 把函数作为参数进行传值
JavaScript 响应式编程模式有点类似 WebForm 中的事件驱动模式(传相应的处理函数给委托,通过事件来触发来进行相关的处理),在 AngularJs 2.x 框架中,应用了 RxJS AP ...
- 383 Ransom Note 赎金信
给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成.如果可以构成,返回 true :否则返回 ...
- SQL在一张表中根据父ID获取所有的子ID
with a as ( select id,name,parentid from categories where id=53 union all select x.id,x.name,x.paren ...
- CSV文件转EXCEl(java)
package main; import java.io.BufferedReader;import java.io.DataInputStream;import java.io.File;impor ...
- IKanalyzer、ansj_seg、jcseg三种中文分词器的实战较量
转自:http://lies-joker.iteye.com/blog/2173086 选手:IKanalyzer.ansj_seg.jcseg 硬件:i5-3470 3.2GHz 8GB win7 ...
- FCC 基础JavaScript 练习5
在赌场21点游戏中,玩家可以通过计算牌桌上已经发放的卡牌的高低值来让自己在游戏中保持优势,这就叫21点算法. 根据下面的表格,每张卡牌都分配了一个值.如果卡牌的值大于0,那么玩家应该追加赌注.反之,追 ...
- C++学习笔记(一)之指针
指向指针的引用 ; int * p; int *&r = p; //r为对指针p的引用 r = &i; //r为对p的引用,故对r赋值即将p指向i *r = ; //更新i的值 通过* ...
- Python中的排序方法
1 list.sort list.sort(key=None, reverse=False) 该方法只能用于list.就地排序,原来的list被修改.key的用法见下文.reverse控制降序还是生序 ...