题意:

思路:

 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)的更多相关文章

  1. 【BZOJ1014】[JSOI2008]火星人prefix Splay+hash

    [BZOJ1014][JSOI2008]火星人prefix Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个 ...

  2. 【bzoj1014】[JSOI2008]火星人prefix Splay+Hash+二分

    题目描述 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 8 9 10 ...

  3. BZOJ 1014: [JSOI2008]火星人prefix( splay + hash )

    用splay维护序列, 二分+hash来判断LCQ.. #include<bits/stdc++.h> using namespace std; typedef unsigned long ...

  4. BZOJ 1014 [JSOI2008]火星人prefix (Splay + Hash + 二分)

    1014: [JSOI2008]火星人prefix Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 8112  Solved: 2569[Submit] ...

  5. bzoj1014: [JSOI2008]火星人prefix splay+hash+二分

    Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 ...

  6. bzoj1014: [JSOI2008]火星人prefix splay+hash

    我写的代码好像自古以来就是bzoj不友好型的 本地跑的比std快,但是交上去巧妙被卡 答案...应该是对的,拍了好久了 #include <bits/stdc++.h> #define M ...

  7. BZOJ1014火星人prefix Splay維護序列 + 字符串哈希

    @[Splay, 哈希] Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:\(madamimadam\), 我们将这个字符串的各个字符予以标号 ...

  8. $bzoj1014-JSOI2008$ 火星人$prefix$ $splay$ $hash$

    题面描述 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:\(madamimadam\),我们将这个字符串的各个字符予以标号: 序号 1 2 3 4 5 6 7 8 ...

  9. bzoj 1014 火星人prefix —— splay+hash

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1014 用 splay 维护字符串上不同位置的哈希值还是第一次... 具体就是每个节点作为位置 ...

  10. 【BZOJ-1014】火星人prefix Splay + 二分 + Hash

    1014: [JSOI2008]火星人prefix Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5852  Solved: 1871[Submit] ...

随机推荐

  1. 整理 Xamarin.Forms - Plugins

    Open Source Components for Xamarin Xamarin官方整理的一些开源组件,有需要可以先到这里找 GitHub: xamarin/XamarinComponents: ...

  2. 数组去重----es6&es5&数组对象去重

    es6方法: 普通数组: 1.使用Array.from(new Set(arr)); /* * @param oldArr 带有重复项的旧数组 * @param newArr 去除重复项之后的新数组 ...

  3. JavaScript编程艺术-第7章代码汇总(2)

    [7.4节] 重回“JavaScript美术馆”代码 ***亲测可用*** HTML: JS:

  4. linux学习之路3 文件系统结构

    一些有用的定义: linux文件系统为一个倒转的单根树状结构 文件系统的根为"/" linux系统文件严格区分大小写,而windows系统不区分大小写 路径使用"/&qu ...

  5. 二分查找 HDOJ 2141 Can you find it?

    题目传送门 /* 题意:给出一个数,问是否有ai + bj + ck == x 二分查找:首先计算sum[l] = a[i] + b[j],对于q,枚举ck,查找是否有sum + ck == x */ ...

  6. RHEL5.6更新yum源

    RHEL5.6更新yum源记录,2017年2月20日 root用户切换目录至:/etc/yum.repos.d/ [root@localhost yum.repos.d]# pwd /etc/yum. ...

  7. ftp获取mysql数据库方法

    我说的这种情况是针对mysql数据库的,首先下载一个mysql通过ftp放到站点里面,然后通过配置文件找到数据库的名字和密码,然后通过浏览器访问数据库,直接在域名后面加上下载的mysql文件的名字就可 ...

  8. CSS 按钮特效(二)

    1 案例 2. HTML 代码 <div class="arrow arrow-left-middle"> arrow-left-middle </div> ...

  9. 两年,VMware又重回巅峰?

    两年前,被公有云和容器打的焦头烂额的VMware一度被众多业界人士看衰,营收.股价双双下滑.然而,仅仅经过短短两年时间,VMware已经和AWS,IBM.微软.Rackspace等众多公有云厂商成为合 ...

  10. nginx--提供一键安装脚本

    nginx特点 基于进程池实现的fastcgi 单一进程即可实现处理上千的连接 易于扩展的插件系统 安装篇 *下载源码 curl -O http://nginx.org/download/nginx- ...