题意:

思路:

 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. vue-cli 升级至 webpack 4 指北

    时至今日(2018-7-11),vue-cli 任然未稳定支持至webpack4,所以我自己也来创建一个 vue 初始化模板 不过大致的原因我也能猜到,因为很多插件仍然是一个不稳定的点,比如我在创建中 ...

  2. 一张图带你了解-常见面试之JUC包详解

    面试时经常问到JUC包下的类及特性,现在用一张图总结下

  3. linux rpm 安装

    1.rpm 安装rpm -ivh package_name-i:install的意思-v:查看更详细的安装信息-h:以安装信息栏显示安装进度rpm -ivh package_name --test 2 ...

  4. java io 读取写文件

    java 读取txt文件,汉字乱码,原因是因为文件的编码格式和程序编码采用了不同的编码格式.通常,假如自己不修改的话,windows自身采用的编码格式是gbk(而gbk和gb2312基本上是一样的编码 ...

  5. [转]C语言字符串操作总结大全(超详细)

    1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度 ...

  6. 平方分割poj2104K-th Number

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 59798   Accepted: 20879 Ca ...

  7. S - Cyclic Components (并查集的理解)

    Description You are given an undirected graph consisting of nn vertices and mm edges. Your task is t ...

  8. Generating RSA keys in PKCS#1 format in Java--转

    原文地址:https://stackoverflow.com/questions/7611383/generating-rsa-keys-in-pkcs1-format-in-java When I ...

  9. log4j2异步日志解读(一)AsyncAppender

    log4j.logback.log4j2 历史和关系,我们就在这里不展开讲了.直接上干货,log4j2突出于其他日志的优势,异步日志实现. 看一个东西,首先看官网文档 ,因为前面文章已经讲解了disr ...

  10. js技巧(三)

    1.检测浏览器,search的用法 if(window.navigator.userAgent.search(/firefox/i)!=-1){ alert('ff'); } else if(wind ...