HDU - 6054 sa + 树状数组套线段树
因为强制在线所以只能转成序列上的问题然后树套树了。。。
#include<bits/stdc++.h>
#define LL long long
#define LD long double
#define ull unsigned long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ALL(x) (x).begin(), (x).end()
#define fio ios::sync_with_stdio(false); cin.tie(0); using namespace std; const int N = 2e5 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-;
const double PI = acos(-); template<class T, class S> inline void add(T& a, S b) {a += b; if(a >= mod) a -= mod;}
template<class T, class S> inline void sub(T& a, S b) {a -= b; if(a < ) a += mod;}
template<class T, class S> inline bool chkmax(T& a, S b) {return a < b ? a = b, true : false;}
template<class T, class S> inline bool chkmin(T& a, S b) {return a > b ? a = b, true : false;} int r[N], sa[N], _t[N], _t2[N], c[N], rk[N], lcp[N], san; void buildSa(int *r, int n, int m) {
int i, j = , k = , *x = _t, *y = _t2;
for(i = ; i < m; i++) c[i] = ;
for(i = ; i < n; i++) c[x[i] = r[i]]++;
for(i = ; i < m; i++) c[i] += c[i - ];
for(i = n - ; i >= ; i--) sa[--c[x[i]]] = i;
for(int k = ; k <= n; k <<= ) {
int p = ;
for(i = n - k; i < n; i++) y[p++] = i;
for(i = ; i < n; i++) if(sa[i] >= k) y[p++] = sa[i] - k;
for(i = ; i < m; i++) c[i] = ;
for(i = ; i < n; i++) c[x[y[i]]]++;
for(i = ; i < m; i++) c[i] += c[i - ];
for(i = n - ; i >= ; i--) sa[--c[x[y[i]]]] = y[i];
swap(x, y);
p = ; x[sa[]] = ;
for(int i = ; i < n; i++) {
if(y[sa[i - ]] == y[sa[i]] && y[sa[i - ] + k] == y[sa[i] + k])
x[sa[i]] = p - ;
else x[sa[i]] = p++;
}
if(p >= n) break;
m = p;
}
for(i = ; i < n; i++) rk[sa[i]] = i;
for(i = ; i < n - ; i++) {
if(k) k--;
j = sa[rk[i] - ];
while(r[i + k] == r[j + k]) k++;
lcp[rk[i]] = k;
}
} struct bit_seg {
int Rt[N], ls[N * ], rs[N * ], sum[N * ], tot, n, maxval;
void init(int _n, int _maxval) {
n = _n; maxval = _maxval;
for(int i = ; i <= tot; i++)
sum[i] = ls[i] = rs[i] = ;
for(int i = ; i <= n; i++) Rt[i] = ;
tot = ;
}
void update(int& o, int pos, int v, int l, int r) {
if(!o) o = ++tot;
sum[o] += v;
if(l == r)return ;
int m = l + r >> ;
if(pos <= m) update(ls[o], pos, v, l, m);
else update(rs[o], pos, v, m + , r);
}
int query(int o, int L, int R, int l, int r) {
if(L > R || l > r || !o) return ;
if(R < l || r < L) return ;
if(L <= l && r <= R) return sum[o];
int m = l + r >> ;
return query(ls[o] , L , R , l , m) + query(rs[o], L, R, m + , r);
}
int bitquery(int L, int R, int a, int b) {
int ans = ;
for(int i = R; i; i -= i & -i) ans += query(Rt[i], a, b, , maxval);
for(int i = L - ; i; i -= i & -i) ans -= query(Rt[i], a, b, , maxval);
return ans;
}
void bitupdate(int i,int pos,int v) {
for( ; i <= n; i += i & -i) update(Rt[i], pos, v, , maxval);
}
} S; int Log[N]; struct ST {
int dp[N][], ty;
void build(int n, int b[], int _ty) {
ty = _ty;
for(int i = ; i <= n; i++) dp[i][] = ty * b[i];
for(int j = ; j <= Log[n]; j++)
for(int i = ; i + ( << j) - <= n; i++)
dp[i][j] = max(dp[i][j - ], dp[i + ( << (j - ))][j - ]);
}
int query(int x, int y) {
int k = Log[y - x + ];
return ty * max(dp[x][k], dp[y - ( << k) + ][k]);
}
} rmq; bool is[N];
char s[N], t[N];
int f[N], q; int main() {
for(int i = -(Log[]=-); i < N; i++)
Log[i] = Log[i - ] + ((i & (i - )) == );
int T; scanf("%d", &T);
while(T--) {
san = ;
scanf("%s%s", s, t);
int lens = strlen(s), lent = strlen(t);
reverse(s, s + lens);
reverse(t, t + lent);
for(int i = ; i < lens; i++) scanf("%d", &f[i]);
reverse(f, f + lens);
for(int i = ; i < lens; i++) {
is[san] = true;
r[san++] = s[i];
}
is[san] = false; r[san++] = '$';
for(int i = ; i < lent; i++) {
is[san] = false;
r[san++] = t[i];
}
is[san] = false; r[san] = ;
S.init(san, lens - );
buildSa(r, san + , );
rmq.build(san, lcp, -);
for(int i = ; i <= san; i++)
if(is[sa[i]]) S.bitupdate(i, sa[i], f[sa[i]]);
scanf("%d", &q);
int a = , b = , c = , d = , add = , ans = , len = ;
int low = , high = , mid, L = , R = ;
while(q--) {
int op; scanf("%d", &op);
if(op == ) {
scanf("%d%d", &a, &b);
a ^= ans; b ^= ans;
a = lens - a - ;
if(a >= lens) {
return ;
}
add = b - f[a];
f[a] = b;
S.bitupdate(rk[a], a, add);
} else {
scanf("%d%d%d%d", &c, &d, &a, &b);
a ^= ans; b ^= ans; c ^= ans; d ^= ans;
a = lens - a - ;
b = lens - b - ;
c = lent - c - + lens + ;
d = lent - d - + lens + ;
swap(a, b); swap(c, d);
len = d - c + ;
low = , high = rk[c] - , L = rk[c], R = rk[c];
while(low <= high) {
mid = low + high >> ;
if(rmq.query(mid + , rk[c]) >= len) high = mid - , L = mid;
else low = mid + ;
}
low = rk[c] + , high = san;
while(low <= high) {
mid = low + high >> ;
if(rmq.query(rk[c] + , mid) >= len) low = mid + , R = mid;
else high = mid - ;
}
b = b - len + ;
if(a > b) ans = ;
else ans = S.bitquery(L, R, a, b);
printf("%d\n", ans);
}
}
}
return ;
} /*
*/
HDU - 6054 sa + 树状数组套线段树的更多相关文章
- bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1384 Solved: 629[Submit][Stat ...
- [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】
题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...
- [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】
题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...
- BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)
题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[ ...
- P3157 [CQOI2011]动态逆序对(树状数组套线段树)
P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...
- BZOJ 1901 Zju2112 Dynamic Rankings 树状数组套线段树
题意概述:带修改求区间第k大. 分析: 我们知道不带修改的时候直接上主席树就可以了对吧?两个版本号里面的节点一起走在线段树上二分,复杂度是O((N+M)logN). 然而这里可以修改,主席树显然是凉了 ...
- bzoj3196 二逼平衡树 树状数组套线段树
题目传送门 思路:树状数组套线段树模板题. 什么是树状数组套线段树,普通的树状数组每个点都是一个权值,而这里的树状数组每个点都是一颗权值线段树,我们用前缀差分的方法求得每个区间的各种信息, 其实关键就 ...
- 【序列操作IV】树状数组套线段树/树套树
题目描述 给出序列 a1,a2,…,an(0≤ai≤109),有关序列的两种操作. 1. ai(1≤i≤n)变成 x(0≤x≤109). 2. 求 al,al+1,…,ar(1≤l≤r≤n)第 k(1 ...
- 2019南昌网络赛 I. Yukino With Subinterval 树状数组套线段树
I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...
- [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树)
[APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树) 题面 略 分析 首先把一组询问(x,y)看成二维平面上的一个点,我们想办法用数据结构维护这个二维平面(注意根据题意这 ...
随机推荐
- Redis实现排行榜功能(实战)
需求前段时间,做了一个世界杯竞猜积分排行榜.对世界杯64场球赛胜负平进行猜测,猜对+1分,错误+0分,一人一场只能猜一次.1.展示前一百名列表.2.展示个人排名(如:张三,您当前的排名106579). ...
- java 多线程 synchronized与lock的通信机制等问题,结合相应实例说明
1. 利用多线程实现如下需求: 写两个线程,一个线程打印1~52,另一个线程打印A~Z,打印顺序是12A34B...5152Z: 2. 使用synchronized 实现 public class T ...
- App测试的策略
(一).App测试的策略 1.App测试需要考虑的方面 设备多样性 操作系统.浏览器.应用程序运行时环境.屏幕分辨率.人机交互界面和接口.人体工程学设计.屏幕尺寸等 运营商网络 ...
- 汇编语言笔记v1.0
1.loop的用法 loop指令的格式是:loop标号,cpu执行loop指令的时候,要进行两步操作 1:(cx)=(cx)-1 2:判断cx中的值,不为零则转至标号处执行,如果为零,则向下执行 这里 ...
- .NET面试题系列(十八)常用关键字
序言 const和readonly关键字 private protected public internal的区别 out ref out适合用在需要retrun多个返回值的地方,而ref则用在需要 ...
- vue组件创建的三种方式
1.使用Vue.extend创建全局的Vue组件 //1.1 使用vue.extend创建组件 var com1 = Vue.extend({ //通过template属性指定组件要展示的html结构 ...
- 【项目】Selenium和pymongo复习
import pymongo client = pymongo.MongoClient(host='localhost',port=27017) db = client.test collection ...
- E: Unable to locate package clang-7 E: Unable to locate package clang++-7 E: Couldn't find any package by regex 'clang++-7'
我的系统是Debian 9.8, 然后在装下面这两个包的时候老是提示找不到.然后再github上一问,过了几分钟就有大佬回复了,而且亲测有效 ~$ sudo apt-get -y install cl ...
- spring cloud 集群健康监控--turbine-dashboard仪表盘
这里仍然以Windows和jdk为运行环境,按照下面的步骤打包-运行-访问就能看到效果. 运维健康监控--hystrix-dashboard仪表盘 java -jar F:\jars-dashboar ...
- 面向对象原生JavaScript案例炫彩小球
面向对象其实对于初学者来说还是比较难以理解的,以前看到一个面试题目 面向对象是什么? 面向对象是一种思想,千万别入坑了: 这次给大家带来的是一个鼠标移动产生小球的案例,不是我不想给大家分享如何去认识面 ...