传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1014

天,写kth()时,把判断条件k <= siz[ch[x][0]]错写成了k <= ch[x][0],RE不停,还爆掉了几个小时,以后写数据结构题一定要头脑清晰啊!

#include <cstdio>
#include <cstring> const int maxn = 300005, base = 131; int fa[maxn], ch[maxn][2], key[maxn], siz[maxn], root, cnt;
unsigned long long hash[maxn], poww[maxn];
int n, m, t1, t2, stk[maxn], top;
char s[maxn], opr, t3; inline void pushup(int x) {
hash[x] = hash[ch[x][0]] * (poww[siz[ch[x][1]] + 1]) + key[x] * poww[siz[ch[x][1]]] + hash[ch[x][1]];
siz[x] = siz[ch[x][0]] + siz[ch[x][1]] + 1;
}
inline void rotate(int x) {
int y = fa[x];
if (y == ch[fa[y]][0]) {
ch[fa[y]][0] = x;
}
else {
ch[fa[y]][1] = x;
}
fa[x] = fa[y];
int dir = x == ch[y][1];
ch[y][dir] = ch[x][dir ^ 1];
fa[ch[x][dir ^ 1]] = y;
ch[x][dir ^ 1] = y;
fa[y] = x;
pushup(y);
pushup(x);
}
inline void splay(int x, int rt) {
int p;
while (fa[x] != rt) {
p = fa[x];
if (fa[p] == rt) {
rotate(x);
}
else {
if ((p == ch[fa[p]][1]) ^ (x == ch[p][1])) {
rotate(x);
}
else {
rotate(p);
}
rotate(x);
}
}
if (!rt) {
root = x;
}
}
int make_tree(int left, int right) {
if (left > right) {
return 0;
}
int rt = (left + right) >> 1;
key[rt] = s[rt];
ch[rt][0] = make_tree(left, rt - 1);
fa[ch[rt][0]] = rt;
ch[rt][1] = make_tree(rt + 1, right);
fa[ch[rt][1]] = rt;
pushup(rt);
return rt;
}
inline int kth(int k) {
int x = root;
while (k != siz[ch[x][0]] + 1) {
if (k <= siz[ch[x][0]]) {
x = ch[x][0];
}
else {
k -= siz[ch[x][0]] + 1;
x = ch[x][1];
}
}
return x;
}
inline void modify(int root1, int root2) {
root1 = kth(root1);
root2 = kth(root2);
splay(root1, 0);
splay(root2, root1);
}
inline void ist(int pos, int _key) {
modify(pos, pos + 1);
++cnt;
hash[cnt] = key[cnt] = _key;
siz[cnt] = 1;
ch[ch[root][1]][0] = cnt;
fa[cnt] = ch[root][1];
pushup(ch[root][1]);
pushup(root);
}
/*void ist(int x, int k, int _key) {
if (k == siz[ch[x][0]] + 1) {
if (ch[x][1]) {
top = 0;
int i;
for (i = ch[x][1]; ch[i][0]; i = ch[i][0]) {
stk[top++] = i;
}
++cnt;
ch[i][0] = cnt;
fa[cnt] = i;
key[cnt] = _key;
siz[cnt] = 1;
pushup(i);
for (i = top - 1; ~i; --i) {
pushup(stk[i]);
}
}
else {
++cnt;
ch[x][1] = cnt;
fa[cnt] = x;
key[cnt] = _key;
}
pushup(x);
splay(cnt, 0);
return;
}
if (k <= siz[ch[x][0]]) {
ist(ch[x][0], k, _key);
}
else {
ist(ch[x][1], k - siz[ch[x][0]] - 1, _key);
}
}*/
void upd(int x, int k, int _key) {
if (k == siz[ch[x][0]] + 1) {
key[x] = _key;
pushup(x);
return;
}
if (k <= siz[ch[x][0]]) {
upd(ch[x][0], k, _key);
}
else {
upd(ch[x][1], k - siz[ch[x][0]] - 1, _key);
}
pushup(x);
}
unsigned long long gethash(int start, int end) {
modify(start - 1, end + 1);
return hash[ch[ch[root][1]][0]];
} int main(void) {
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
scanf("%s", s + 2);
n = strlen(s + 2);
s[1] = s[n + 2] = '$';
n += 2;
cnt = n;
poww[0] = 1;
for (int i = 1; i < maxn; ++i) {
poww[i] = poww[i - 1] * base;
}
root = make_tree(1, n);
scanf("%d", &m);
int left, right, mid;
while (m--) {
while ((opr = getchar()) < 'A');
scanf("%d", &t1);
++t1;
if (opr == 'I') {
while ((t3 = getchar()) < 'a');
ist(t1, t3);
++n;
}
else if (opr == 'R') {
while ((t3 = getchar()) < 'a');
upd(root, t1, t3);
}
else {
scanf("%d", &t2);
++t2;
left = 0;
right = n - (t1 > t2? t1: t2);
while (left != right) {
mid = (left + right + 1) >> 1;
if (gethash(t1, t1 + mid - 1) == gethash(t2, t2 + mid - 1)) {
left = mid;
}
else {
right = mid - 1;
}
}
printf("%d\n", left);
}
}
return 0;
}

  

_bzoj1014 [JSOI2008]火星人prefix【Splay】的更多相关文章

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

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

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

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

  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

    [BZOJ1014][JSOI2008]火星人prefix Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个 ...

  6. [BZOJ1014] [JSOI2008] 火星人prefix (splay & 二分答案)

    Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 ...

  7. bzoj1014: [JSOI2008]火星人prefix splay+hash+二分

    Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 ...

  8. [bzoj1014](JSOI2008)火星人 prefix (Splay维护哈希)

    Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀. 比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 ...

  9. 【bzoj1014】[JSOI2008]火星人prefix Splay+Hash+二分

    题目描述 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 8 9 10 ...

随机推荐

  1. 浅谈python中的“ ==” 与“ is”、还有cmp

    总之,比较内容相等使用 ‘==’ 1.is" 是用来比较 a 和 b 是不是指向同一个内存单元,而"=="是用来比较 a 和 b指向的内存单元中的值是不是相等 2.pyt ...

  2. cocos2d-x进化为2.5D的一些想法

     首先我得说Unity3D已经做的非常好了,搞这些东西意义真心不大.详细Unity3D有什么优势我之前也写过两篇文章来阐述自己的想法.         假设我的下一份工作是U3D的话,预计我就不会 ...

  3. Linux 命令 sudo

    sudo 这个命令. 是为了 让 普通用户 ,也能够以root的身份来运行 操作, 而这些普通用户 又不须要知道root的password. 在 sudo 运行命令的时候. 仅仅须要 输入自己的pas ...

  4. 【Facebook的UI开发框架React入门之八】Image的使用简单介绍(iOS平台)-goodmao

    --------------------------------------------------------------------------------------------------- ...

  5. 程序C++ to C#交互

    第一次用C#调用C/C++生成的DLL文件,感觉有点新鲜,事实上仅仅是实现了执行在公共语言执行库 (CLR) 的控制之外的"非托管代码"(执行在公共语言执行库(CLR)的控制之中的 ...

  6. Java-ReentrantReadWriteLock的简单样例

    内容:读锁时共享的.写锁时相互排斥的(可见执行结果).都是通过AQS实现的. public class ReentrantReadWriteLockTest { static class MyObje ...

  7. Eclipse项目遇到问题汇总

    1:gc overhead limit exceeded     原因:这是由于项目中eclipse内存分配不足导致     修改:修改eclipse.ini文件     修改如下:          ...

  8. 关于集成支付宝SDK的开发

    下载 首先,你要想找到这个SDK,都得费点功夫.如今的SDK改名叫移动支付集成开发包了,下载页面在 这里 的 "请点此下载集成开发包" Baidu和Googlep排在前面的支付宝开 ...

  9. 编程题:1. var person = '{name:"Lily",sex:"famale",age:24,country:"US"}';将person转换成JSON对象并便利每个属性值。

    /// <summary> /// Json工具类 /// </summary> public class JsonUtility { private static JsonU ...

  10. Java 负载均衡

    什么是负载均衡 负载均衡,英文 名称为Load Balance,指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助.通过某种 负载分 ...