因为强制在线所以只能转成序列上的问题然后树套树了。。。

#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 + 树状数组套线段树的更多相关文章

  1. bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1384  Solved: 629[Submit][Stat ...

  2. [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】

    题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...

  3. [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】

    题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...

  4. 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[ ...

  5. P3157 [CQOI2011]动态逆序对(树状数组套线段树)

    P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...

  6. BZOJ 1901 Zju2112 Dynamic Rankings 树状数组套线段树

    题意概述:带修改求区间第k大. 分析: 我们知道不带修改的时候直接上主席树就可以了对吧?两个版本号里面的节点一起走在线段树上二分,复杂度是O((N+M)logN). 然而这里可以修改,主席树显然是凉了 ...

  7. bzoj3196 二逼平衡树 树状数组套线段树

    题目传送门 思路:树状数组套线段树模板题. 什么是树状数组套线段树,普通的树状数组每个点都是一个权值,而这里的树状数组每个点都是一颗权值线段树,我们用前缀差分的方法求得每个区间的各种信息, 其实关键就 ...

  8. 【序列操作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 ...

  9. 2019南昌网络赛  I. Yukino With Subinterval 树状数组套线段树

    I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...

  10. [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树)

    [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树) 题面 略 分析 首先把一组询问(x,y)看成二维平面上的一个点,我们想办法用数据结构维护这个二维平面(注意根据题意这 ...

随机推荐

  1. Activity之间的跳转和数据传输

    1.显式跳转 protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceSt ...

  2. 运行selenium脚本,报seleneium common exception.SessionNotCreatedException:Message:Unable to find a matching set of capabilities错误

  3. STL迭代器iterator

    一:迭代器原理 迭代器是一个“可遍历STL容器内全部或部分元素”的对象. 迭代器指出容器中的一个特定位置. 迭代器就如同一个指针. 迭代器提供对一个容器中的对象的访问方法,并且可以定义了容器中对象的范 ...

  4. netcore项目在Windows部署:使用NSSM部署Windows服务

    NSSM部署Windows服务 1 准备工作 在Windows平台部署Asp.net core应用程序一般采用IIS,但是如果我们的net core应用执行的是定时任务,需要开机自启,稳定运行的话,使 ...

  5. 转载:在做datatable时候查询数据和条数只用一次sql就可以解决需求

    前言:最近用datatable处理数据比较多,所以在使用时候想提升性能 select * from t_hr_leave SELECT FOUND_ROWS() //返回查询记录的总数 select ...

  6. 循环队列和链式队列(C++实现)

    循环队列: 1.循环队列中判断队空的方法是判断front==rear,队满的方法是判断front=(rear+1)%maxSize.(我曾经想过为什么不用一个length表示队长,当length==m ...

  7. typescript + echarts-for-react 制作渐变柱状图, 提示[ts] 类型“Graphic”上不存在属性“LinearGradient”

    更新: 2019/03 无意间发现Graphic上已有 LinearGradient属性 

  8. vue-router.esm.js:1905 TypeError: Cannot convert undefined or null to object

    环境:vue+vuex+element 报错原因 ...mapState('isDialNumber') mapState如果传递一个参数,参数必须是数组 ...mapState(['isDialNu ...

  9. vue较深入的知识点

    1 理解何为虚拟节点 虚拟dom是什么? 虚拟dom就是通过js对象来模拟描述dom树,包括tag,attr, children等属性来代表标签名,属性,子元素等.由于不需要有操作dom的方法,所以比 ...

  10. 419 JQuery and BootStrap

    把葵花宝典剩下的知识讲完了 又学习了bootstrap <link rel="stylesheet" href="css/bootstrap.css"&g ...