这个操作十分的复杂

但是可以拿平衡树维护

直接二分答案然后用$hash$值判断即可

复杂度$O(10000 * log^2 n + n \log n)$

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; #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 = , w = ; char c = gc();
while(c > '' || c < '') { if(c == '-') w = -; c = gc(); }
while(c >= '' && c <= '') p = p * + c - '', c = gc();
return p * w;
} inline char gcr() {
char c = gc();
while() {
if(c >= 'a' && c <= 'z') return c;
if(c >= 'A' && c <= 'Z') return c;
c = gc();
}
} const int sid = ;
const int sed = ; char s[sid];
int n, m, rt, at, bt, ct, dt, id;
int sz[sid], ls[sid], rs[sid], pri[sid];
ull wei[sid], sum[sid], val[sid]; inline int rand() {
static int seed = ;
return seed = (1ll * seed * ) % ;
} inline int newnode(char v) {
++ id;
val[id] = v; sz[id] = ;
pri[id] = rand(); sum[id] = v;
return id;
} inline void upd(int o) {
sz[o] = sz[ls[o]] + sz[rs[o]] + ;
sum[o] = sum[ls[o]] + sum[rs[o]] * wei[sz[ls[o]] + ];
sum[o] += val[o] * wei[sz[ls[o]] + ];
} inline int merge(int x, int y) {
if(!x || !y) return x + y;
if(pri[x] > pri[y]) {
rs[x] = merge(rs[x], y);
upd(x); return x;
}
else {
ls[y] = merge(x, ls[y]);
upd(y); return y;
}
} inline void split(int o, int k, int &x, int &y) {
if(!o) { x = y = ; return; }
if(k <= sz[ls[o]]) y = o, split(ls[o], k, x, ls[o]);
else x = o, split(rs[o], k - sz[ls[o]] - , rs[o], y);
upd(o);
} inline ull getHash(int l, int r) {
split(rt, r, at, bt);
split(at, l - , ct, dt);
ull ret = sum[dt];
rt = merge(ct, merge(dt, bt));
return ret;
} inline bool check(int x, int y, int v) {
return getHash(x, x + v - ) == getHash(y, y + v - );
} int main() {
scanf("%s", s + );
n = strlen(s + ); wei[] = ;
rep(i, , ) wei[i] = wei[i - ] * sed;
rep(i, , n) rt = merge(rt, newnode(s[i])); m = read();
rep(i, , m) {
char c = gcr();
int x, y; char d;
if(c == 'Q') {
x = read(); y = read();
if(x > y) swap(x, y);
int l = , r = n - y + , ans = ;
while(l <= r) {
int mid = (l + r) >> ;
if(check(x, y, mid)) {
l = mid + , ans = mid;
printf("qaq -> %d\n", mid);
}
else r = mid - ;
}
printf("%d\n", ans);
}
else if(c == 'R') {
x = read(); d = gcr();
split(rt, x - , at, bt);
split(bt, , ct, dt);
rt = merge(at, merge(newnode(d), dt));
}
else if(c == 'I') {
n ++;
x = read(); d = gcr();
split(rt, x, at, bt);
rt = merge(at, merge(newnode(d), bt));
}
}
return ;
}

luoguP4036 [JSOI2008]火星人 平衡树+hash的更多相关文章

  1. BZOJ_1014_[JSOI2008]火星人prefix_splay+hash

    BZOJ_1014_[JSOI2008]火星人prefix_splay+hash 题意:火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam, 我们 ...

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

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

  3. BZOJ1014:[JSOI2008]火星人(Splay,hash)

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

  4. 2018.06.28 BZOJ1014 [JSOI2008]火星人prefix(非旋treap+hash)

    [JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MB Submit: 8951 Solved: 2860 Description 火星 ...

  5. 【bzoj1014】: [JSOI2008]火星人prefix 平衡树-字符串-hash-二分

    [bzoj1014]: [JSOI2008]火星人 用平衡树维护字符串的hash 然后询问的时候二分一下就好了 /* http://www.cnblogs.com/karl07/ */ #includ ...

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

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

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

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

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

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

  9. 【BZOJ1014】[JSOI2008]火星人prefix Splay+hash

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

随机推荐

  1. 信息安全学习笔记--CSRF

      一.CSRF简介   CSRF(Cross-site request forgery)跨站请求伪造,也被称为“one click attack”或者“session riding”,通常缩写为CS ...

  2. 信息安全学习笔记--XSS

    一.XSS简介 XSS (Cross Site Scripting)是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中.比如这些代码包括HTML代 ...

  3. 【黑客免杀攻防】读书笔记15 - 源码免杀、C++壳的编写

    1.源码免杀 1.1 定位产生特征的源码 定位文件特征 1.根据MyCCL的特征码定位工具,定位出有特征的地址 2.根据VS的反汇编窗口,输入有特征的地址得到特征地址与源码的关系 3.插入Messag ...

  4. HADOOP百度云资料

    百度云下载地址: 链接:http://pan.baidu.com/s/1pL56hkv 密码:u4h3 解压密码:www.mukedaba.com

  5. Django-模板继承、包含和静态文件配置

    一.模板继承 模板继承可以减少页面内容的重复定义,实现页面内容的重用 典型应用:网站的头部.尾部是一样的,这些内容可以定义在父模板中,子模板不需要重复定义 block标签:在父模板中预留区域,在子模板 ...

  6. MySQL学习笔记:delete from与truncate table的区别

    在Mysql数据库的使用过程中,删除表数据可以通过以下2种方式: delete from table_name truncate table table_name (1)delete from语句可以 ...

  7. jar包重启脚本-restart.sh

    #!/bin/sh PROJECT_PATH=/var/www/ PROJECT_NAME=demo.jar PROJECT_ALL_LOG_NAME=logs/demo-all.log # stop ...

  8. 团体队列(UVa540)

    题目具体描述见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_prob ...

  9. Rookey.Frame企业级快速开发框架开源了

    Rookey.Frame是一套基于.NET MVC + easyui的企业级极速开发框架,支持简单逻辑模块零代码编程.支持工作流(BPM).支持二次开发,具有高扩展性.高复用性.高伸缩性:应广大网友要 ...

  10. LoadRunner脚本篇

    LoadRunner脚本篇     1概述 2脚本录制 3脚本编写 4脚本调试   关  键  词:LoadRunner 性能测试脚本 摘      要:编写一个准确无误的脚本对性能测试有至关重要的意 ...