显然只能有$hash$来做....

我们需要一个东西来维护$\sum i * seed^{rank[i]}$

很自然地联想到平衡树

如果以序列下标建立一棵平衡树,那么无法处理

因此,可以以权值为下标建立一棵平衡树,把$rank[i]$拆分成若干个$sz[ls] + 1$即可维护

具体而言,记$pos[i]$表示$i$号节点的位置,$sum[i]$表示平衡树中$i$号节点的子树形成的$hash$值

那么,$sum[i] = pos[i] * seed^{sz[ls] + 1} + sum[ls] + sum[rs] * seed^{sz[ls] + 1}$

首先预处理出所有$A$串的$hash$值,存进$map$中

处理时,注意$[1, m]$和$[2, m + 1]$的串在平衡树中的$hash$值会有一个增量的区别

由于元素两两不同,因此可以确定增量为$\sum seed^i$

之后,每次动态地维护$B$串的$hash$值,查询即可

下面的代码由于插入了$-1$,因此更新时略有不同...

复杂度$O(n \log n)$

#include <map>
#include <cstdio>
#include <cstring>
using namespace std; #define ll long long
#define ri register int
#define ull unsigned long long
#define rep(io, st, ed) for(ri io = st; io <= ed; io ++)
#define drep(io, ed, st) for(ri io = ed; io >= st; io --)
#define gc getchar
inline int read() {
int p = ; char c = gc();
while(c > '' || c < '') c = gc();
while(c >= '' && c <= '') p = p * + c - '', c = gc();
return p;
} const int sid = ;
const int seed = ; ll val[sid];
map <ull, int> ans;
int n, m, q, rt, id, A[sid], B[sid];
ull pos[sid], sum[sid], wei[sid];
int s[sid][], sz[sid], fa[sid]; inline bool isrc(int o) {
return s[fa[o]][] == o;
} inline void upd(int o) {
int ls = s[o][], rs = s[o][];
sz[o] = sz[ls] + sz[rs] + ;
sum[o] = wei[sz[ls]] * pos[o] + sum[ls] + wei[sz[ls] + ] * sum[rs];
} inline void rotate(int o) {
int f = fa[o], g = fa[f];
int ro = isrc(o), rf = isrc(f);
fa[o] = g; if(g) s[g][rf] = o;
s[f][ro] = s[o][ro ^ ];
fa[f] = o; fa[s[o][ro ^ ]] = f;
s[o][ro ^ ] = f; upd(f); upd(o);
} inline void splay(int o, int tar) {
while(fa[o] != tar) {
int f = fa[o], g = fa[f];
if(g != tar) rotate(isrc(o) == isrc(f) ? f : o);
rotate(o);
}
if(!tar) rt = o;
} inline void insert(ll v, int w) {
int o = rt, f = ;
while(o) f = o, o = s[o][v > val[o]];
o = ++ id;
if(f) s[f][v > val[f]] = o;
fa[o] = f; sz[o] = ; val[o] = v;
pos[o] = w; sum[o] = w;
splay(o, );
} inline void find(ll v) {
int o = rt;
while(s[o][v > val[o]] && val[o] != v)
o = s[o][v > val[o]];
splay(o, );
} inline void erase(int v) {
find(v);
int pre = s[rt][], suf = s[rt][];
while(s[pre][]) pre = s[pre][];
while(s[suf][]) suf = s[suf][];
splay(pre, ); splay(suf, pre);
s[suf][] = ;
if(suf) upd(suf);
if(pre) upd(pre);
} inline void Hash() {
ull exa = ; wei[] = ;
rep(i, , m + ) wei[i] = wei[i - ] * seed;
rep(i, , m) exa += wei[i]; insert(-, ); insert(, );
rep(i, , m) insert(A[i], i);
rep(i, m, n) {
ans[sum[rt] - exa * (i - m)] ++;
if(i == n) break;
erase(A[i - m + ]);
insert(A[i + ], i + );
}
rt = ;
rep(i, , id) {
s[i][] = s[i][] = sz[i] = ;
val[i] = sum[i] = fa[i] = ;
}
id = ;
} int main() {
n = read(); m = read(); q = read();
rep(i, , n) A[i] = read();
Hash();
insert(-, ); insert(, );
rep(i, , m) B[i] = read();
rep(i, , m) insert(B[i], i);
rep(i, , q) {
int x = read(), c = read();
erase(B[x]);
insert(B[x] = c, x);
printf("%d\n", ans[sum[rt]]);
}
return ;
}

luoguP4715 [英语]Z语言 平衡树+hash的更多相关文章

  1. 中文编程语言Z语言开源正式开源!!!

    (Z语言基于.NET环境,源码中有很多高技术的代码,让更多的人知道对大家有会有很好的帮助,请管理员一点要批准放在首页) 本人实现的中文编程语言Z语言现在正式开源,采用LGPL协议. 编译器核心的网址为 ...

  2. 中文编程语言之Z语言初尝试: ZLOGO 4

    原文: https://zhuanlan.zhihu.com/p/31505895. 作者为本人. @TKT2016 开发的Z语言(ZLOGO是它的一个部分)是本人至今看到的唯一一个仍活跃开发的开源且 ...

  3. 2017-11-28 中文编程语言之Z语言初尝试: ZLOGO 4

    "中文编程"知乎专栏原文. 作者为本人. @TKT2016 开发的Z语言(ZLOGO是它的一个部分)是本人至今看到的唯一一个仍活跃开发的开源且比较完整的中文编程语言项目. 它的源码 ...

  4. 除了C语言,C++······竟然还有Z语言?

    只能说自己见识短,头一次听说Z语言.先普及一下吧: Z语言是由牛津大学程序设计研究小组开发的一种形式语言,它是一种以一阶谓词演算为主要理论基础的规约语言,是一种功能性语言.Z语言是将事物的状态和行为用 ...

  5. [Luogu4715]「英语」Z 语言

    luogu description 你有一个长度为\(n\)的串\(A\)和一个长度为\(m\)的串\(B\),字符集大小\(2^{31}\),且同一个串中没有相同的元素. 定义\(B\)串与\(A_ ...

  6. P4715 「英语」Z 语言

    题解: 平衡树维护hash值 为了支持加入删除操作 x*base^y 其中y为他是第k大 同一般的维护方法,我们不用对每个节点维护他的hash值 而是只用记录他的x值(他的位置) 然后通过updata ...

  7. luoguP4036 [JSOI2008]火星人 平衡树+hash

    这个操作十分的复杂 但是可以拿平衡树维护 直接二分答案然后用$hash$值判断即可 复杂度$O(10000 * log^2 n + n \log n)$ #include <cstdio> ...

  8. inno setup 多语言安装

    之前的安装程序默认语言为英文,现在我们需要将它变成中文,由于InnoSetup安装包中默认没有带中文语言文件,我们需要下载一个先: 到http://www.400gb.com/u/758954/123 ...

  9. 学习C++语言的50条忠告

    50条忠告:(其中有几条觉得写的不够贴切,所以删了,发了余下的部分) 1.把C++当成一门新的语言学习: 2.看<Thinking In C++>,不要看<C++变成死相>: ...

随机推荐

  1. Unity3D 程序打包报错(程序是连接数据库进行处理的)

    打包这个Unity3D的程序时出现错误(程序是由XML数据改成连接数据库): ArgumentException: The Assembly System.Configuration is refer ...

  2. Virut样本取证特征

    1.网络特征 ant.trenz.pl ilo.brenz.pl 2.文件特征 通过对文件的定位,使用PEID查看文件区段,如果条件符合增加了7个随机字符区段的文件,则判定为受感染文件. 3.受感染特 ...

  3. Spiral Matrix I & II

    Spiral Matrix I Given an integer n, generate a square matrix filled with elements from 1 to n^2 in s ...

  4. aarch64_p2

    perl-Crypt-URandom-0.36-6.fc26.noarch.rpm 2017-02-12 07:17 16K fedora Mirroring Project perl-Crypt-X ...

  5. 使用postman做接口测试(二)

    参考大神总结:https://www.cnblogs.com/Skyyj/p/6856728.html 二,下边的东西工作中实际要用到了 1, postman安装 chrome浏览器打开chrome: ...

  6. sublime Text快捷键(超级全)

    sublime Text快捷键(超级全) Ctrl+Shift+P:打开命令面板 Ctrl+P:搜索项目中的文件 Ctrl+G:跳转到第几行 Ctrl+W:关闭当前打开文件 Ctrl+Shift+W: ...

  7. html5拖拽初窥

    说到拖动,大概有两种方式,一种是js实现,之前已经介绍过,今天来讲解另外一种方式,那就是使用html5实现拖动. css样式 .box { width: 200px; height: 200px; b ...

  8. 基于gRpc的远程服务框架

    作为一个新搭建的软件团队,底层技术尤为重要.为了以后更好的面向不同的项目需求,满足不断变化的需求,决定着手搭建一套RPC系统.为了更好的兼容以后部门其他语言的使用,选择了开源框架gRpc. gRpc ...

  9. git —— 远程仓库(操作)

    运行目录:本地仓库目录 1.本地关联远程仓库 $ git remote add origin 你的远程库地址(SSH和HTTP都可以) 2.远程仓库为空,可选择合并远程仓库和本地仓库,远程库不为空时, ...

  10. Oracle工作笔记

    重命名表 RENAME PUB_ORDER_DATE_RES TO PUB_ORDER_DATA_RES; 新增字段 ); 删除字段 ALTER TABLE PUB_ORDER_DATA_RES DR ...