luoguP4715 [英语]Z语言 平衡树+hash
显然只能有$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的更多相关文章
- 中文编程语言Z语言开源正式开源!!!
(Z语言基于.NET环境,源码中有很多高技术的代码,让更多的人知道对大家有会有很好的帮助,请管理员一点要批准放在首页) 本人实现的中文编程语言Z语言现在正式开源,采用LGPL协议. 编译器核心的网址为 ...
- 中文编程语言之Z语言初尝试: ZLOGO 4
原文: https://zhuanlan.zhihu.com/p/31505895. 作者为本人. @TKT2016 开发的Z语言(ZLOGO是它的一个部分)是本人至今看到的唯一一个仍活跃开发的开源且 ...
- 2017-11-28 中文编程语言之Z语言初尝试: ZLOGO 4
"中文编程"知乎专栏原文. 作者为本人. @TKT2016 开发的Z语言(ZLOGO是它的一个部分)是本人至今看到的唯一一个仍活跃开发的开源且比较完整的中文编程语言项目. 它的源码 ...
- 除了C语言,C++······竟然还有Z语言?
只能说自己见识短,头一次听说Z语言.先普及一下吧: Z语言是由牛津大学程序设计研究小组开发的一种形式语言,它是一种以一阶谓词演算为主要理论基础的规约语言,是一种功能性语言.Z语言是将事物的状态和行为用 ...
- [Luogu4715]「英语」Z 语言
luogu description 你有一个长度为\(n\)的串\(A\)和一个长度为\(m\)的串\(B\),字符集大小\(2^{31}\),且同一个串中没有相同的元素. 定义\(B\)串与\(A_ ...
- P4715 「英语」Z 语言
题解: 平衡树维护hash值 为了支持加入删除操作 x*base^y 其中y为他是第k大 同一般的维护方法,我们不用对每个节点维护他的hash值 而是只用记录他的x值(他的位置) 然后通过updata ...
- luoguP4036 [JSOI2008]火星人 平衡树+hash
这个操作十分的复杂 但是可以拿平衡树维护 直接二分答案然后用$hash$值判断即可 复杂度$O(10000 * log^2 n + n \log n)$ #include <cstdio> ...
- inno setup 多语言安装
之前的安装程序默认语言为英文,现在我们需要将它变成中文,由于InnoSetup安装包中默认没有带中文语言文件,我们需要下载一个先: 到http://www.400gb.com/u/758954/123 ...
- 学习C++语言的50条忠告
50条忠告:(其中有几条觉得写的不够贴切,所以删了,发了余下的部分) 1.把C++当成一门新的语言学习: 2.看<Thinking In C++>,不要看<C++变成死相>: ...
随机推荐
- imperva 更改web界面的密码
通过SSH作为用户根登录到MX(或通过另一个用户并提升) 运行命令“su oracle” //首先切换到oracle用户 sqlplus secure/(密码) /用此命令登录到数据库 s ...
- Small Private Cloud Deployment Solution
项目背景 为用户提供可访问的桌面虚拟机,方便软件研发人员日常办公,软件开发,编译等工作.主要操作包括Visor制图.程序开发测试以及使用office软件办公. 目前阶段需要支持100台虚拟机(4VCP ...
- Vue起步
Vue起步 Vue.js是什么 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式javascript框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用. ...
- Mac下破解intellij IDEA 2018
一.在进入下面网站下载破解补丁 http://idea.lanyus.com/ 二.在“应用程序”中找到已经安装的IntelliJ IDEA,在app上右键,选择“显示包内容”,如下图: 将下载的破解 ...
- 查找Python包的依赖包(语句)
Window 10家庭中文版,Python 3.6.4, 今天看完了urllib3的官文(官方文档),因为没有具体使用过,所以,仍然是一知半解,但是,突然想知道 urllib3以及前面学习过的requ ...
- 安装pywin32模块
1.先下载pywin32对于的版本 下载地址:python for windows extensions 2.选择自己对应的版本,我的是python3.5版本 注意注意注意:此处一定要看清楚自己的py ...
- [java笔记]常用的设计模式
1.单例设计模式 单例设计模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 1)构造方法私有化 2)声明一个本类对象 3)给外部提供一个静态方法获取对象实例 例如: class Singl ...
- COLLATE CHINESE_PRC_CI_AS_WS 的含义
排序规则:COLLATE CHINESE_PRC_CI_AS_WS 的含义 在创建数据表时,常会用到这个. 含义当中,CHINESE_prc_ 是代表中国大陆.如果是台湾,则如:Chinese_TAI ...
- 2、图文讲解.NET CLR是什么
大家首先要清楚的是,.NET平台与C#不是一回事.这点大家一定要明白,对开发人员来讲他有两个概念.第一,它是C#,VB.net等程序运行的平台.第二,它因为为这些语言提供了丰富的类库(称之为基类库), ...
- CCF CSP 201609-3 炉石传说
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201609-3 炉石传说 问题描述 <炉石传说:魔兽英雄传>(Hearthston ...