1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <vector>
  6.  
  7. using namespace std;
  8.  
  9. typedef unsigned long long ull;
  10. const int x = ;
  11. const int maxn = 4e5 + ;
  12.  
  13. ull xp[maxn];
  14. int n, m;
  15. struct Node {
  16. Node* ch[];
  17. int r, v, s;
  18. int val;
  19. ull Hush[];
  20. int flip;
  21. Node(int v1, int v2): v(v1), val(v2) {
  22. r = rand();
  23. s = ;
  24. ch[] = ch[] = NULL;
  25. flip = ;
  26. Hush[] = Hush[] = val;
  27. }
  28. bool cmp(const int &x) const {
  29. if(x == v) return -;
  30. return x < v ? : ;
  31. }
  32. void maintain() {
  33. s = ;
  34. Hush[] = Hush[] = val;
  35. if(ch[] != NULL) s += ch[]->s, Hush[] = ch[]->Hush[ch[]->flip] + val*xp[ch[]->s];
  36. if(ch[] != NULL) Hush[] += (ch[]->Hush[ch[]->flip])*xp[s], s += ch[]->s;
  37. int s2 = ;
  38. if(ch[] != NULL) s2 += ch[]->s, Hush[] = ch[]->Hush[(ch[]->flip)^] + val*xp[ch[]->s];
  39. if(ch[] != NULL) Hush[] += (ch[]->Hush[(ch[]->flip)^])*xp[s2];
  40. }
  41. void pushdown() {
  42. if(flip) {
  43. flip = ;
  44. swap(ch[], ch[]);
  45. if(ch[] != NULL) ch[]->flip = !ch[]->flip;
  46. if(ch[] != NULL) ch[]->flip = !ch[]->flip;
  47. }
  48. }
  49. };
  50.  
  51. void rotate(Node* &o, int d) {
  52. Node* k = o->ch[d^]; o->ch[d^] = k->ch[d]; k->ch[d] = o;
  53. o->maintain(); k->maintain(); o = k;
  54. }
  55.  
  56. void insert(Node* &o, int x, int val) {
  57. if(o == NULL) o = new Node(x, val);
  58. else {
  59. int d = o->cmp(x);
  60. insert(o->ch[d], x, val);
  61. if(o->ch[d]->r > o->r) rotate(o, d^);
  62. }
  63. o->maintain();
  64. }
  65. void splay(Node* &o, int k) {
  66. o->pushdown();
  67. int s = o->ch[] == NULL ? : o->ch[]->s;
  68. int d = k <= s ? : (k == s+? - : );
  69. if(d == ) k -= s+;
  70. if(d != -) {
  71. splay(o->ch[d], k);
  72. rotate(o, d^);
  73. }
  74. }
  75.  
  76. Node * merge(Node* left, Node* right) {
  77. splay(left, left->s);
  78. left->ch[] = right;
  79. left->maintain();
  80. return left;
  81. }
  82. void split(Node* o, int k , Node* &left, Node* &right) {
  83. splay(o, k);
  84. left = o;
  85. right = o->ch[];
  86. o->ch[] = NULL;
  87. left->maintain();
  88. }
  89.  
  90. void oper1(Node* &o, int p, int c) {
  91. Node* left, *right;
  92. Node* node = new Node(p+, c);
  93. split(o, p+, left, right);
  94. o = merge(merge(left, node), right);
  95. }
  96. void oper2(Node* &o, int p) {
  97. Node* left, *mid, *right;
  98. split(o, p, left, mid);
  99. split(mid, , mid, right);
  100. o = merge(left, right);
  101. }
  102. void oper3(Node* &o, int p1, int p2) {
  103. Node *left, *mid, *right;
  104. split(o, p1, left, mid);
  105. split(mid, p2-p1+, mid, right);
  106. mid->flip ^= ;
  107. o = merge(merge(left, mid), right);
  108. }
  109. ull Hush_val(Node* &o, int p, int L) {
  110. Node *left, *mid, *right;
  111. split(o, p, left, mid);
  112. split(mid, L, mid, right);
  113. ull ans = mid->Hush[mid->flip];
  114. o = merge(merge(left, mid), right);
  115. return ans;
  116. }
  117. int oper4(Node* &o, int p1, int p2) {
  118. int L = , R = min(n-p1+, n-p2+);
  119. while(L < R) {
  120. int M = R - (R-L)/;
  121. int l1 = Hush_val(o, p1, M), l2 = Hush_val(o, p2, M);
  122. if(l1 == l2) L = M;
  123. else R = M-;
  124. }
  125. return L;
  126. }
  127. char s[maxn];
  128. int main() {
  129. xp[] = ;
  130. for(int i = ; i < maxn; i++) xp[i] = xp[i-]*x;
  131. while(scanf("%d%d", &n, &m) == ) {
  132. scanf("%s", s);
  133. Node* root = new Node(, );
  134. for(int i = ; i < n; i++) {
  135. int c = s[i] - '';
  136. insert(root, i+, c);
  137. }
  138. for(int i = ; i < m; i++) {
  139. int id, p1, p2;
  140. scanf("%d", &id);
  141. if(id == ) {
  142. scanf("%d%d", &p1, &p2);
  143. oper1(root, p1, p2);
  144. n++;
  145. }
  146. if(id == ) {
  147. scanf("%d", &p1);
  148. oper2(root, p1);
  149. n--;
  150. }
  151. if(id == ) {
  152. scanf("%d%d", &p1, &p2);
  153. oper3(root, p1, p2);
  154. }
  155. if(id == ) {
  156. scanf("%d%d", &p1, &p2);
  157. int ans = oper4(root, p1, p2);
  158. printf("%d\n", ans);
  159. }
  160. }
  161. }
  162. return ;
  163. }

UVA 11996 Jewel Magic —— splay、序列的分裂与合并、LCP的哈希算法的更多相关文章

  1. UVa 11996 Jewel Magic (splay + Hash + 二分)

    题意:给定一个长度为n的01串,你的任务是依次执行如表所示的m条指令: 1 p c 在第p个字符后插入字符,p = 0表示在整个字符串之前插入2 p 删除第p个字符,后面的字符往前移3 p1 p2反转 ...

  2. UVA - 11996 Jewel Magic (Treap+二分哈希)

    维护一个01序列,一共四种操作: 1.插入一个数 2.删除一个数 3.反转一个区间 4.查询两个后缀的LCP 用Splay或者Treap都可以做,维护哈希值,二分求LCP即可. 注意反转序列的时候序列 ...

  3. Jewel Magic UVA - 11996 || bzoj1014: [JSOI2008]火星人prefix

    Jewel Magic UVA - 11996 这是一道用splay/非旋treap做的题(这里用的是非旋treap) 1/2/3是splay/非旋treap的常规操作.对于操作4,可以用哈希法求LC ...

  4. UVA - 11922 Permutation Transformer (splay)

    题目链接 题意:你的任务是根据m条指令改变排列{!,2,3,...,n}.每条指令(a,b)表示取出第a~b个元素,翻转后添加到排列的尾部.输出最终序列. 解法:splay对区间分裂合并翻转,模板题. ...

  5. BZOJ1500: [NOI2005]维修数列 [splay序列操作]【学习笔记】

    以前写过这道题了,但我把以前的内容删掉了,因为现在感觉没法看 重写! 题意: 维护一个数列,支持插入一段数,删除一段数,修改一段数,翻转一段数,查询区间和,区间最大子序列 splay序列操作裸题 需要 ...

  6. uva 1608 不无聊的序列

    uva 1608 不无聊的序列 紫书上有这样一道题: 如果一个序列的任意连续子序列中都至少有一个只出现一次的元素,则称这个序列时不无聊的.输入一个n个元素的序列,判断它是不是无聊的序列.n<=2 ...

  7. [BZOJ4552][TJOI2016&&HEOI2016]排序(二分答案+线段树/线段树分裂与合并)

    解法一:二分答案+线段树 首先我们知道,对于一个01序列排序,用线段树维护的话可以做到单次排序复杂度仅为log级别. 这道题只有一个询问,所以离线没有意义,而一个询问让我们很自然的想到二分答案.先二分 ...

  8. Java中使用IO流实现大文件的分裂与合并

    文件分割应该算一个比较实用的功能,举例子说明吧比如说:你有一个3G的文件要从一台电脑Copy到另一台电脑, 但是你的存储设备(比如SD卡)只有1G ,这个时候就可以把这个文件切割成3个1G的文件 ,分 ...

  9. 模板——伸展树 splay 实现快速分裂合并的序列

    伸展操作:将treap中特定的结点旋转到根 //将序列中从左数第k个元素伸展到根,注意结点键值保存的是原序列id void splay(Node* &o, int k) { ] == NULL ...

随机推荐

  1. 粉丝裂变活动bug

    1 二维码ios无法扫描 也不知道是现在二维码长按识别的机制改了还是咋样,之前如果二维码ios 太小或者位置不对无法识别就加个透明的二维码,一般是妥妥的,但是这次就是不行,排除fixed,变形等等 解 ...

  2. uml设计之多重性

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

  3. bnd -buildpath指令的用法

    -buildpath的作用是为项目添加运行时依赖.这个依赖可以是workspace中的另一个项目或者是仓库中的另一个bundle. -buildpath指令只会在编译和构建时起作用,它从来不会被用来运 ...

  4. 如何使我们的薪资15k?

    以下我们来探讨一下如何才能使我们具备高薪15K的能力? 要想使自己的薪资成为15K,我首先想到的是我们的能力?编码能力?语言表达能力? 我觉得为之重要的则是我们的综合能力: 方方面面的能力.综合素质: ...

  5. laravel 分页带参数

    {{$data->appends(request()->except(['page']))->links()}}

  6. hdu1503 LCS

    题意:如果有相同的字母,这些字母只输出一次.其余的都输出. 先做一次LCS,标记相同的字母,然后回溯输出. #include<stdio.h> #include<string.h&g ...

  7. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十六章:实例化和截头锥体裁切

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十六章:实例化和截头锥体裁切 代码工程地址: https://git ...

  8. 正则表达式问题:如何理解/href\s*=\s*(?:"(?<1>[^"]*)"|(?<1>\S+))/(转载)

    ms-help://MS.VSCC/MS.MSDNVS.2052/jscript7/html/jsjsgrpregexpsyntax.htm 该文虽有解释, 但没有样例,对我这样的初学者来说很难理解 ...

  9. UVA_494:Kindergarten Counting Game

    Language: C++ 4.8.2 #include<stdio.h> #include<ctype.h> int main(void) { int ch; int wor ...

  10. ArcMap影像纠偏

    客户给了一张PNG图,如下图,需要提取其中北极航线. 策略是ArcMap中先配准PNG,使之与底图较好重合.再新建线图层,描出航线.这种彩色丰富的图,很难用栅格转矢量的方式,故应用描边法. 一.配准P ...