1. /*
  2. 一个性质? right集合中只有相邻的位置才会有用
  3. 那么考虑set启发式合并, 能够求出大概nlogn个有用的对
  4. 那么将这些对按照右端点排序, 查询也按照右端点排序就可以离线维护信息
  5. 然后需要维护答案的话?? 区间和一次函数取max???
  6. 应该有别的办法吧
  7. 普通线段树就好了
  8. */
  9. #include<cstdio>
  10. #include<algorithm>
  11. #include<cstring>
  12. #include<set>
  13. #include<queue>
  14. #include<iostream>
  15. #define ll long long
  16. #define mmp make_pair
  17. #define M 200010
  18. using namespace std;
  19. int read() {
  20. int nm = 0, f = 1;
  21. char c = getchar();
  22. for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
  23. for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0';
  24. return nm * f;
  25. }
  26. set<int> st[M];
  27. set<int>::iterator it, tt;
  28. int ch[M][26], fa[M], len[M], sz[M], ans[M], lst = 1, cnt = 1, n, m, tp;
  29. char s[M];
  30. vector<int> to[M];
  31. struct Note {
  32. int l, r, max;
  33. bool operator < (const Note &b) const {
  34. return this->r < b.r;
  35. }
  36. } note[M * 60], que[M];
  37. void insert(int pl, int c) {
  38. int p = ++cnt, f = lst;
  39. lst = p;
  40. len[p] = len[f] + 1;
  41. while(f && !ch[f][c]) ch[f][c] = p, f = fa[f];
  42. if(f == 0) fa[p] = 1;
  43. else {
  44. int q = ch[f][c];
  45. if(len[q] == len[f] + 1) fa[p] = q;
  46. else {
  47. int nq = ++cnt;
  48. len[nq] = len[f] + 1;
  49. fa[nq] = fa[q];
  50. memcpy(ch[nq], ch[q], sizeof(ch[q]));
  51. fa[p] = fa[q] = nq;
  52. while(f && ch[f][c] == q) ch[f][c] = nq, f = fa[f];
  53. }
  54. }
  55. sz[p] = 1;
  56. st[p].insert(pl);
  57. }
  58. int id[M];
  59. bool cmp(int a, int b) {
  60. return sz[a] > sz[b];
  61. }
  62. void dfs(int now) {
  63. id[now] = now;
  64. int flag = sz[now];
  65. for(int i = 0; i < to[now].size(); i++) {
  66. int vj = to[now][i];
  67. dfs(vj);
  68. sz[now] += sz[vj];
  69. }
  70. if(now == 1) return;
  71. sort(to[now].begin(), to[now].end(), cmp);
  72. if(to[now].size() != 0) {
  73. id[now] = id[to[now][0]];
  74. if(flag) {
  75. int v = *st[now].begin();
  76. it = st[id[now]].lower_bound(v);
  77. if(it != st[id[now]].end()) {
  78. note[++tp] = (Note) {
  79. v, *it, len[now]
  80. };
  81. }
  82. if(it != st[id[now]].begin()) {
  83. it--;
  84. note[++tp] = (Note) {
  85. *it, v, len[now]
  86. };
  87. }
  88. st[id[now]].insert(v);
  89. }
  90. for(int i = 1; i < to[now].size(); i++) {
  91. int vj = to[now][i];
  92. it = st[id[vj]].begin();
  93. while(it != st[id[vj]].end()) {
  94. int v = *it++;
  95. tt = st[id[now]].lower_bound(v);
  96. if(tt != st[id[now]].end()) {
  97. note[++tp] = (Note) {
  98. v, *tt, len[now]
  99. };
  100. }
  101. if(tt != st[id[now]].begin()) {
  102. tt--;
  103. note[++tp] = (Note) {
  104. *tt, v, len[now]
  105. };
  106. }
  107. st[id[now]].insert(v);
  108. }
  109. }
  110. }
  111. }
  112. struct Black_ {
  113. #define ls now << 1
  114. #define rs now << 1 | 1
  115. #define lson l, mid, now << 1
  116. #define rson mid + 1, r, now << 1 | 1
  117. int t[M << 2], len[M << 2], ver[M << 2], maxx[M << 2];
  118. void build(int l, int r, int now) {
  119. len[now] = r - l + 1;
  120. ver[now] = -0x3e3e3e3e;
  121. if(l == r) return;
  122. int mid = (l + r) >> 1;
  123. build(lson), build(rson);
  124. }
  125. void add(int now, int v) {
  126. ver[now] = max(ver[now], v);
  127. maxx[now] = max(maxx[now], ver[now] + len[now]);
  128. }
  129. void pushup(int now) {
  130. maxx[now] = max(maxx[now], max(maxx[ls], maxx[rs]));
  131. }
  132. void pushdown(int now) {
  133. add(rs, ver[now]);
  134. add(ls, ver[now] + len[rs]);
  135. }
  136. int que(int l, int r, int now, int ln, int rn) {
  137. if(l > rn || r < ln) return 0;
  138. if(l >= ln && r <= rn) return maxx[now];
  139. int mid = (l + r) >> 1;
  140. pushdown(now);
  141. return max(que(lson, ln, rn), que(rson, ln, rn));
  142. }
  143. void modi(int l, int r, int now, int ln, int rn, int v) {
  144. if(l > rn || r < ln) return;
  145. if(l >= ln && r <= rn) {
  146. add(now, v);
  147. return;
  148. }
  149. int mid = (l + r) >> 1;
  150. pushdown(now);
  151. modi(lson, ln, rn, v + min(max(rn - mid, 0), len[rs]));
  152. modi(rson, ln, rn, v);
  153. pushup(now);
  154. }
  155. void modify(int r, int v) {
  156. modi(1, n, 1, r - v + 1, r, 0);
  157. }
  158. int query(int l, int r) {
  159. return que(1, n, 1, l, r);
  160. }
  161. } Seg;
  162. int main() {
  163. // freopen("string_example_3.in", "r", stdin); freopen("zz.out", "w", stdout);
  164. n = read(), m = read();
  165. scanf("%s", s + 1);
  166. for(int i = 1; i <= n; i++) insert(i, s[i] - 'a');
  167. for(int i = 2; i <= cnt; i++) to[fa[i]].push_back(i);
  168. dfs(1);
  169. for(int i = 1; i <= m; i++) que[i].l = read(), que[i].r = read(), que[i].max = i;
  170. sort(note + 1, note + tp + 1);
  171. // puts(s + 1);
  172. // for(int i = 1; i <= tp; i++) {
  173. // cerr<< note[i].l << " " << note[i].r << " " << note[i].max << "\n";
  174. // }
  175. // cerr << tp << "\n";
  176. sort(que + 1, que + m + 1);
  177. int tp1 = 1, tp2 = 1;
  178. Seg.build(1, n, 1);
  179. for(int i = 1; i <= n; i++) {
  180. while(tp1 <= tp && note[tp1].r <= i) {
  181. Seg.modify(note[tp1].l, note[tp1].max);
  182. tp1++;
  183. }
  184. while(tp2 <= m && que[tp2].r <= i) {
  185. ans[que[tp2].max] = Seg.query(que[tp2].l, que[tp2].r);
  186. tp2++;
  187. }
  188. }
  189. for(int i = 1; i <= m; i++) cout << ans[i] << "\n";
  190. return 0;
  191. }

Problem C: 重复子串(string)的更多相关文章

  1. POJ 1743 (后缀数组+不重叠最长重复子串)

    题目链接: http://poj.org/problem?id=1743 题目大意:楼教主の男人八题orz.一篇钢琴谱,每个旋律的值都在1~88以内.琴谱的某段会变调,也就是说某段的数可以加减一个旋律 ...

  2. POJ 1743 Musical Theme (后缀数组,求最长不重叠重复子串)(转)

    永恒的大牛,kuangbin,膜拜一下,Orz 链接:http://www.cnblogs.com/kuangbin/archive/2013/04/23/3039313.html Musical T ...

  3. poj 1743 男人八题之后缀数组求最长不可重叠最长重复子串

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 14874   Accepted: 5118 De ...

  4. hdu_2668 Daydream O(n)求最长不重复子串

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2668 Daydream Time Limit: 2000/1000 MS (Java/Others)  ...

  5. [Jobdu] 题目1530:最长不重复子串

    题目描述: 最长不重复子串就是从一个字符串中找到一个连续子串,该子串中任何两个字符都不能相同,且该子串的长度是最大的. 输入: 输入包含多个测试用例,每组测试用例输入一行由小写英文字符a,b,c... ...

  6. ACdream 1430——SETI——————【后缀数组,不重叠重复子串个数】

    SETI Time Limit: 4000/2000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statist ...

  7. POJ3693 Maximum repetition substring —— 后缀数组 重复次数最多的连续重复子串

    题目链接:https://vjudge.net/problem/POJ-3693 Maximum repetition substring Time Limit: 1000MS   Memory Li ...

  8. SPOJ - REPEATS —— 后缀数组 重复次数最多的连续重复子串

    题目链接:https://vjudge.net/problem/SPOJ-REPEATS REPEATS - Repeats no tags  A string s is called an (k,l ...

  9. [LeetCode] Longest Substring Without Repeating Characters 最长无重复子串

    Given a string, find the length of the longest substring without repeating characters. For example, ...

随机推荐

  1. Win10系列:C#应用控件基础11

    RichEditBox控件 富文本格式是一种跨平台的文档格式,在这种格式的文档中可以编辑文本.图片.链接等内容.通过RichEditBox控件可以对富文本格式的文档进行编辑. 在XAML文件中,Ric ...

  2. ansible批量管理工具的搭建与简单的操作

    ansible的安装 # [root@localhost ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@localhost ...

  3. LeetCode 总结,二叉树各种类型问题小结

    三大遍历 前序遍历 中序遍历 后序遍历 关于三大基础遍历,必须要条件反射式的记住:三种遍历的迭代方式使用的都是栈,后序遍历必须使用了 两个栈,其余乱七八糟的解决方式统统就不要再记了. 广度遍历: 分析 ...

  4. jQuery键盘敲击事件,换键的话换键码就可以

    $("body").keyup(function () { if (event.which == 13){ $("#Btn_login").trigger(&q ...

  5. [Data Structure] Tree - relative

    Segment Tree First, try to build the segment tree. lintcode suggest code: Currently recursion recomm ...

  6. wc语法

    统计当前目录下的所有文件行数: wc -l * 当前目录以及子目录的所有文件行数: find  . * | xargs wc -l 可以把*改成所要匹配的文件,例如Java文件,*.java这样就只统 ...

  7. 吴恩达机器学习-octave笔记

    隐藏前缀提示符:PS1('>>') 不显示打印内容:;结尾 字符串:a=’hi’ 屏幕输出:disp(sprint(‘2 decimals:%0.2f’,a)) 生成集合(矩阵):V=1: ...

  8. Windows系统,Tensorflow的Tensorboard工具细节问题

    随着跟着TensorFlow视频学习,学到Tensorboard可视化工具这里的时候. 在windows,cmd里面运行,tensorboard --logdir=你logs文件夹地址  这行代码,一 ...

  9. linux 创建sudo账号.md

    内容来源自网络 方案一 root登录 ssh root@server_ip_address 新增用户 adduser username 设置密码 passwd username 输入两次密码 修改帐户 ...

  10. python学习之路05

    控制流语句 博主认为所有的语言中,控制语句都是差不多的,无非就是循环,判断,if ,while,for.更重要的是,多加的练习,实战中发现自身问题,加深巩固 所以,下面会以实际的题目为主. 1.用户在 ...