题面

洛谷

Bzoj

题解

首先,这种带修改的是不能用$SA$的,然后,我们做$SA$的题一般也能二分+$Hash$,所以不妨考虑用$FHQ-Treap$维护树,然后查询就用二分+$Hash$。

$Hash$怎么写?

$ hash[o]=hash[lc[o]]\times base[siz[rc[o]]+1]+val[o]\times base[siz[rc[o]]]+hash[rc[o]] $

为什么可以这么写呢?想一想,为什么

我们一般怎么求一颗维护序列的平衡树的原序列呢?—中序遍历

所以嘛,一棵子树的哈希值可以转化成它左子树的哈希值+本身的值+右子树哈希值

由于怕重复,所以可以考虑将前面两个值随便乘上一点什么东西(比如左子树或者右子树的$size$之类的)

#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm> template<typename T>
void read(T &x) {
int flag = 1; x = 0; char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') flag = -flag; ch = getchar(); }
while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); x *= flag;
} const int N = 3e5 + 10;
char s[N];
int m, len, base[N];
int rt, tot, lc[N], rc[N], pri[N], siz[N], h[N], val[N]; inline void upt(int o) {
siz[o] = siz[lc[o]] + siz[rc[o]] + 1;
h[o] = h[lc[o]] * base[siz[rc[o]] + 1] + val[o] * base[siz[rc[o]]] + h[rc[o]];
}
inline int node(int x) { siz[++tot] = 1, val[tot] = h[tot] = x, pri[tot] = rand(); return tot; }
void split(int o, int k, int &l, int &r) {
if(!o) { l = r = 0; return ; }
if(siz[lc[o]] < k) l = o, split(rc[o], k - siz[lc[o]] - 1, rc[o], r);
else r = o, split(lc[o], k, l, lc[o]);
upt(o);
}
int merge(int l, int r) {
if(!l || !r) return l + r;
if(pri[l] < pri[r]) { rc[l] = merge(rc[l], r), upt(l); return l; }
else { lc[r] = merge(l, lc[r]), upt(r); return r; }
}
inline int query(int l, int r) {
int x, y, k, ret;
split(rt, r, x, y), split(x, l - 1, x, k);
ret = h[k], rt = merge(merge(x, k), y);
return ret;
} int main () {
scanf("%s", s + 1), len = strlen(s + 1), srand(19260817), base[0] = 1;
for(int i = 1; i < N; ++i) base[i] = base[i - 1] * 27;
for(int i = 1; i <= len; ++i) rt = merge(rt, node(s[i] - 'a' + 1));
read(m); char opt[5], ch[5]; int x, y, l, r, k;
while(m--) {
scanf("%s", opt), read(x);
if(opt[0] == 'Q') {
read(y); int L = 0, R = std::min(len - x, len - y) + 1, ret;
while(L <= R) {
int mid = (L + R) >> 1;
if(query(x, x + mid - 1) == query(y, y + mid - 1)) ret = mid, L = mid + 1;
else R = mid - 1;
} printf("%d\n", ret);
} else {
scanf("%s", ch), split(rt, x, l, r), ++len;
if(opt[0] == 'R') --len, split(l, x - 1, l, k);
rt = merge(merge(l, node(ch[0] - 'a' + 1)), r);
}
}
return 0;
}

Bzoj 1014&Luogu 4036 火星人Prefix(FHQ-Treap)的更多相关文章

  1. 【BZOJ 1014】 [JSOI2008]火星人prefix

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1014 [题意] 让你在线查询最长公共前缀. 支持单节点修改; 插入操作; [题解] / ...

  2. [BZOJ1074] [luogu 4036] [JSOI 2008] 火星人 (二分答案+哈希+fhq treap)

    [BZOJ1074] [luogu 4036] [JSOI 2008] 火星人 (二分答案+哈希+fhq treap) 题面 给出一个长度为n的字符串,m个操作,字符串仅包含小写英文字母 操作1:在k ...

  3. 【BZOJ】【1014】【JLOI2008】火星人prefix

    Splay/二分/Hash 看了网上的题目关键字(都不用点进去看……我也是醉了)了解到做法= =那就上呗,前面做了好几道Splay的题就是为了练手搞这个的. Hash判断字符串是否相同应该很好理解吧? ...

  4. BZOJ 1014: [JSOI2008]火星人prefix [splay 二分+hash] 【未完】

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

  5. BZOJ 1014: [JSOI2008]火星人prefix Splay+二分

    1014: [JSOI2008]火星人prefix 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1014 Description 火星人 ...

  6. bzoj 1014: [JSOI2008]火星人prefix hash && splay

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

  7. 求帮看!!!!BZOJ 1014 [JSOI2008]火星人prefix

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

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

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

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

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

随机推荐

  1. select + 回调 + 事件循环

    #1. epoll并不代表一定比select好 # 在并发高的情况下,连接活跃度不是很高, epoll比select # 并发性不高,同时连接很活跃, select比epoll好 #通过非阻塞io实现 ...

  2. javaScript 进阶篇

    1.js 数组 创建数组的语法: a. var myarray= new Array(8); myarray[0]=1;等等 b.var myarray = new Array(66,8,47,59, ...

  3. mysql 并发测试

    针对上一节做一些针对公司业务的测试. 我们来做一些压力测试. 服务器配置: 操作系统: centos 5.6-64 CPU: 8核 内存: 8G 硬盘:sas 文件系统:linux MySQL:5.6 ...

  4. quick-cocos2d-x数据存储 UserDefault GameState io

    看了quick-cocos2d-x 的framework,发现里面有一个GameState,查了下,是数据存储的类,于是稍稍总结下我用到过的数据存储方式吧. 一共是三种方法: cc.UserDefau ...

  5. [IOS]vmxsmc.exe已停止工作 VMware11 Unlocker for Mac OSX无法使用的解决办法.

    今天我帮同事安装VMware workstation12后发现之前的unlocker已经无法进行解锁了(就是VMware新建虚拟机无App Mac选项) 使用unlocker会出现vmsxmc.exe ...

  6. elementui table 多选 获取id

    //多选相关方法 toggleSelection(rows) { if (rows) { rows.forEach(row => { this.$refs.multipleTable.toggl ...

  7. jq_$.extend和$.fn.extend插件开发和方法的封装

    --------杂谈-------- 随着使用的使用js和jq使用的越来越娴熟,也就是说日常产品经理给的一些需求,已经在自己的能力范围内了.空出来了一点时间,来研究如何优化你的代码, 不管是性能上,还 ...

  8. socket 编程 TCP 实现简单聊天功能【转】

    转自:http://blog.csdn.net/liujia2100/article/details/9006479 版权声明:本文为博主原创文章,未经博主允许不得转载. 各个主要函数的功能: .so ...

  9. nfs 文件共享 服务

    需要rpc服务: [root@xujiaxuan ftp]# service rpcbind start[root@xujiaxuan ftp]# chkconfig rpcbind on 设置开机自 ...

  10. 设计模式之笔记--单例模式(Singleton)

    单例模式(Singleton) 定义 单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点. 类图 描述 类Singleton的构造函数的修饰符为private,防止用 ...