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)看成二维平面上的一个点,我们想办法用数据结构维护这个二维平面(注意根据题意这 ...
随机推荐
- JS学习笔记Day23
一.什么是Promise (一)Promise是ES6新增的解决异步(非阻塞)中存在的问题而产生的构造函数 二.Promise中的三种状态 pending(进行中) resoved(成功后) reje ...
- Vue-router(基础)_滚动行为和history模式
一.前言 1.滚动事件 2.h5 history模式 二.主要内容 1. (1)使用前度路由,当切换到新路由时,想要页面滚动到顶部,或者是保持原先滚动的位置,就像重新加载页面那样.vue-rout ...
- [Bzoj 2956] 模积和 (整除分块)
整除分块 一般形式:\(\sum_{i = 1}^n \lfloor \frac{n}{i} \rfloor * f(i)\). 需要一种高效求得函数 \(f(i)\) 的前缀和的方法,比如等差等比数 ...
- shiro 介绍和基本使用
一.什么是shiro 它是一个功能强大且易于使用的Java安全框架,可以执行身份验证.授权.加密和会话管理.使用Shiro易于理解的API,您可以快速且轻松地保护任何应用程序——从最小的移动应用程序到 ...
- Swagger Edit 安装和使用教程
Swagger Edit介绍Swagger是专门用来管理接口一个工具.在开发过程中,接口一直是纷争的聚焦点,能有效管理接口(保存好记录.及时更新.方便查看.接口测试).会让整个项目开发效率提升很大. ...
- 2、搭建一个简单的Web项目
一.创建一个Web项目: 1.File->new Project->Java->JavaEE->Web Application 2.为项目起名: 3.配置项目:在项目上击右键- ...
- jmeter使用csv传参进行并发测试验证
1.获取到注册接口,添加HTTP信息头管理器.HTTP请求,设置好入参,且检查使用csv文件传参的入参 2.创建csv文件,写入需要传的入参 3.添加CSV Data Set Config 设置配置 ...
- vue项目中遇到的那些事。
前言 有好几天没更新文章了.这段实际忙着做了一个vue的项目,从 19 天前开始,到今天刚好 20 天,独立完成. 做vue项目做这个项目一方面能为工作做一些准备,一方面也精进一下技术. 技术栈:vu ...
- Kafka安装配置
Kafka是由Apache软件基金会开发的一个高吞吐量的分布式发布订阅消息系统,由Scala和Java编写.官网地址:http://kafka.apache.org 0.基本概念 Broker:Kaf ...
- 在线制作微信跳转浏览器下载app/打开指定页面源码
微信自动跳转外部浏览器下载app/打开指定页面源码 源码说明: 适用安卓和苹果系统,支持任何网页链接.并且无论链接是否已经被微信拦截,均可实现微信内自动跳转浏览器打开. 生成的跳转链接具有极佳的防拦截 ...