看了《Hash在信息学竞赛中的一类应用》中的例题3,这道题很类似啊,只不过没有删点和区间翻转。

用Splay维护字符串哈希,加点改点什么的就不用说了,查询时二分答案,这样时间复杂度是$O(mlog^2 n)$的

论文的例题3中删点很简单,和插点一样,不用说了,区间翻转只要打一个翻转标记,维护正序hash和逆序hash,翻转时交换两个hash值即可。

对拍终于成功了QAQ,插点时孩子不认父亲TwT又手残了~

《Hash在信息学竞赛中的一类应用》中还提到了块状链表的做法,都很易懂:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 100003;
const int p = 9875321; int P[N];
struct node *null;
struct node {
node *ch[2], *fa;
int k, s, ha;
node (int _k = 0) {k = _k; s = 1; ha = _k; ch[0] = ch[1] = fa = null;}
void setc(node *r, bool c) {this->ch[c] = r; r->fa = this;}
bool pl() {return fa->ch[1] == this;}
void count() {
s = ch[0]->s + ch[1]->s + 1;
ha = ((ch[0]->ha + 1ll * k * P[ch[0]->s]) % p + 1ll * ch[1]->ha * P[ch[0]->s + 1] % p) % p;
}
} *root; int n, m;
char s[N]; namespace Splay {
node *Build(int l, int r) {
if (l > r) return null;
int mid = (l + r) >> 1;
node *t = new node(s[mid] - 'a');
t->ch[0] = Build(l, mid - 1); t->setc(t->ch[0], 0);
t->ch[1] = Build(mid + 1, r); t->setc(t->ch[1], 1);
t->count();
return t;
}
void init() {
P[0] = 1; for(int i = 1; i < N; ++i) P[i] = P[i - 1] * 26 % p;
null = new node; null->s = 0; null->ch[0] = null->ch[1] = null->fa = null;
scanf("%s", s + 1); n = strlen(s + 1); root = Build(1, n);
}
void rotate(node *r) {
node *f = r->fa;
bool c = r->pl();
if (f != root) f->fa->setc(r, f->pl());
else root = r, r->fa = null;
f->setc(r->ch[!c], c);
r->setc(f, !c);
f->count();
}
void splay(node *r, node *tar = null) {
for(; r->fa != tar; rotate(r))
if (r->fa->fa != tar) rotate(r->pl() == r->fa->pl() ? r->fa : r);
r->count();
}
node *kth(int k) {
node *r = root;
while (1) {
if (r->ch[0]->s >= k) r = r->ch[0];
else if (r->ch[0]->s + 1 >= k) return r;
else k -= (r->ch[0]->s + 1), r = r->ch[1];
}
}
int hash(int l, int r) {
if (l == 1 && r == n) return root->ha;
else if (l == 1) {splay(kth(r + 1)); return root->ch[0]->ha;}
else if (r == n) {splay(kth(l - 1)); return root->ch[1]->ha;}
else {splay(kth(l - 1)); splay(kth(r + 1), root); return root->ch[1]->ch[0]->ha;}
}
void QQ(int l, int r) {
int left = 0, right = root->s - max(l, r) + 1, mid;
while (left < right) {
mid = (left + right + 1) >> 1;
if (hash(l, l + mid - 1) == hash(r, r + mid - 1)) left = mid;
else right = mid - 1;
}
printf("%d\n", left); return;
}
void RR(int k, int num) {
node *r = kth(k);
r->k = num;
splay(r);
}
void II(int k, int num) {
if (k == 0) {
node *r = root;
while (r->ch[0] != null) r = r->ch[0];
r->setc(new node(num), 0);
splay(r->ch[0]);
} else {
splay(kth(k));
if (k == n) {
root->setc(new node(num), 1);
splay(root->ch[1]);
} else {
splay(kth(k + 1), root);
root->ch[1]->setc(new node(num), 0);
splay(root->ch[1]->ch[0]);
}
}
++n;
}
} int main() {
Splay::init();
scanf("%d", &m);
char c; int x, y;
while (m--) {
for(c = getchar(); c < 'A' || c > 'Z'; c = getchar());
switch (c) {
case 'Q':
scanf("%d%d", &x, &y);
Splay::QQ(x, y);
break;
case 'R':
scanf("%d", &x); for(c = getchar(); c < 'a' || c > 'z'; c = getchar());
Splay::RR(x, c - 'a');
break;
case 'I':
scanf("%d", &x); for(c = getchar(); c < 'a' || c > 'z'; c = getchar());
Splay::II(x, c - 'a');
break;
}
}
return 0;
}

对拍大法好~

【BZOJ 1014】【JSOI 2008】火星人prefix的更多相关文章

  1. JSOI 2008 火星人prefix

    FROM http://www.lydsy.com/JudgeOnline/problem.php?id=1014 LCP问题 给定串 S[0..n] , 对于一对(a,b)其中0<a,b< ...

  2. Bzoj 1014&Luogu 4036 火星人Prefix(FHQ-Treap)

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

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

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

  4. [BZOJ 1013][JSOI 2008] 球形空间产生器sphere 题解(高斯消元)

    [BZOJ 1013][JSOI 2008] 球形空间产生器sphere Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球 面 ...

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

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

  6. BZOJ 1016 JSOI 2008 最小生成树计数 Kruskal+搜索

    题目大意:给出一些边,求出一共能形成多少个最小生成树. 思路:最小生成树有非常多定理啊,我也不是非常明确.这里仅仅简单讲讲做法.关于定各种定理请看这里:http://blog.csdn.net/wyf ...

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

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

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

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

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

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

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

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

随机推荐

  1. hdu-5933----hdu-5943

    hdu-5933 思路: 贪心,首先要求总和是k的倍数,而又要求相邻,说明相邻的一块如果是sum/k的倍数,那么就地切割这样才能使操作数目最少; hdu-5934 思路: 强连通分量,可以找出强连通分 ...

  2. Unity3D中Update()与FixedUpdate()的区别

    Unity3D中Update()与FixedUpdate()的区别是什么呢?从字面上理解,它们都是在更新时会被调用,并且会循环的调用.但是Update会在每次渲染新的一帧时,被调用.而FixedUpd ...

  3. C++ ODB 框架(未实践使用)

    http://www.codesynthesis.com/products/odb/doc/manual.xhtml#17.1

  4. 如何在Kali Linux下编译Windows Exploit

    前言 微软的Windows在企业或是个人应用领域占据着最大的市场份额,在渗透测试过程中你会经常遇到很多Windows的工作站和服务器.另一方面,大多数渗透测试人员主要使用基于Linux的发行版渗透测试 ...

  5. NOIP模拟赛 夕阳

    题目描述 “我有个愿望,我希望在灿烂千阳时遇见你.” 这是个有n个点的世界,有m条无向边连接着这n个点,但是不保证点之间能够互相到达. “这个世界的夕阳,只在奇数长的简单路径的尽头.”一个神如是说. ...

  6. SQLite 增、删、改、查

    1.iOS中实现SQLite的增.删.改.查  http://www.jianshu.com/p/0b9b78e704a4. 2.用数据库实现收藏功能 http://www.jianshu.com/p ...

  7. FJOI省队集训 florida

    省队成员(大部分)都没来...像我这种沙茶天天写写玄学算法都能排在榜上面...果然正解写挂的人远比暴力拍对的人少啊...陆陆续续会补一些题解.(不过有些题太神了可能补不上题解 有n个物品,两个袋子A和 ...

  8. Java 集合系列07之 Stack详细介绍(源码解析)和使用示例

    概要 学完Vector了之后,接下来我们开始学习Stack.Stack很简单,它继承于Vector.学习方式还是和之前一样,先对Stack有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它. ...

  9. 043医疗项目-模块四:采购单模块—采购单明细查询(Dao,Service,Action三层)

    前一篇文章我们做的是在医院的角度上添加在采购单里面添加药品.这一篇文章是查看我们添加的采购单信息. 我们先看一下要实现的效果:当: 按下确认添加时,会在这里 显示出刚才添加的数据. 好,我们就来做这个 ...

  10. office2016各个版本 以及 解决visio搜索任何都提示无匹配项问题

    http://tieba.baidu.com/p/4089747196 版本:Office 2016 Visio 专业版 32位版文件名:SW_DVD5_Visio_Pro_2016_W32_ChnS ...