http://www.lydsy.com/JudgeOnline/problem.php?id=3879

SvT的中文是后缀虚树?

反正本蒟蒻不懂,还是$O(nlogn)$的后缀数组和单调栈维护来做,fye学姐讲了这种学法(当时并没有听懂QwQ),xiaoyimi教会了我这种做法→xiaoyimi的题解

一开始贡献了2次TLE,以为是玄学的死循环,果断挂起对拍器拍了一晚上,然后在回家的路上才想起来TLE是因为提交的时候忘删freopen了

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. typedef long long ll;
  6. const int N = 500003;
  7. const ll p = 23333333333333333ll;
  8. int in() {
  9. int k = 0, fh = 1; char c = getchar();
  10. for(; c < '0' || c > '9'; c = getchar())
  11. if (c == '-') fh = -1;
  12. for(; c >= '0' && c <= '9'; c = getchar())
  13. k = (k << 3) + (k << 1) + c - '0';
  14. return k * fh;
  15. }
  16.  
  17. int c[N], t1[N], t2[N];
  18.  
  19. void st(int *x, int *y, int *sa, int n, int m) {
  20. for(int i = 0; i < m; ++i) c[i] = 0;
  21. for(int i = 0; i < n; ++i) ++c[x[y[i]]];
  22. for(int i = 1; i < m; ++i) c[i] += c[i - 1];
  23. for(int i = n - 1; i >= 0; --i) sa[--c[x[y[i]]]] = y[i];
  24. }
  25.  
  26. void mkhz(int *r, int *sa, int n, int m) {
  27. int *x = t1, *y = t2, *t, p, i, j;
  28. for(i = 0; i < n; ++i) x[i] = r[i], y[i] = i;
  29. st(x, y, sa, n, m);
  30. for(p = 1, j = 1; p < n; m = p, j <<= 1) {
  31. for(p = 0, i = n - j; i < n; ++i) y[p++] = i;
  32. for(i = 0; i < n; ++i) if (sa[i] >= j) y[p++] = sa[i] - j;
  33. st(x, y, sa, n, m);
  34. for(t = x, x = y, y = t, p = 1, x[sa[0]] = 0, i = 1; i < n; ++i)
  35. x[sa[i]] = y[sa[i]] == y[sa[i - 1]] && y[sa[i] + j] == y[sa[i - 1] + j] ? p - 1 : p++;
  36. }
  37. }
  38.  
  39. void mkh(int *r, int *sa, int *rank, int *h, int n) {
  40. int k = 0, j, i;
  41. for(i = 0; i < n; ++i) rank[sa[i]] = i;
  42. for(i = 1; i < n; h[rank[i++]] = k)
  43. for(k ? --k : 0, j = sa[rank[i] - 1]; r[i + k] == r[j + k]; ++k);
  44. }
  45.  
  46. char s[N];
  47. int n, m, sa[N], rank[N], r[N], h[N], f[N][20], Log_2[N], a[N];
  48.  
  49. int get_min(int l, int r) {
  50. int len = Log_2[r - l];
  51. return min(f[l][len], f[r - (1 << len)][len]);
  52. }
  53.  
  54. int get_LCP(int l, int r) {
  55. l = rank[l]; r = rank[r];
  56. if (l > r) swap(l, r);
  57. return get_min(l, r);
  58. }
  59.  
  60. bool cmp(int x, int y) {
  61. return rank[x] < rank[y];
  62. }
  63.  
  64. int sta[N], top, bef[N], size[N];
  65.  
  66. void sub(ll &x, ll y) {
  67. x -= y; if (x < 0) x += p;
  68. }
  69.  
  70. void add(ll &x, ll y) {
  71. x += y; if (x > p) x -= p;
  72. }
  73.  
  74. int main() {
  75. n = in(); m = in();
  76. scanf("%s", s + 1);
  77. r[0] = 0;
  78. for(int i = 1; i <= n; ++i) r[i] = s[i] - 'a' + 1;
  79. mkhz(r, sa, n + 1, 27);
  80. mkh(r, sa, rank, h, n + 1);
  81.  
  82. for(int i = 0; i < n; ++i) f[i][0] = h[i + 1];
  83. for(int j = 1; j < 20; ++j)
  84. for(int i = 0; i < n; ++i) {
  85. if (i + (1 << (j - 1)) >= n) break;
  86. f[i][j] = min(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
  87. }
  88.  
  89. int tmp = 0;
  90. for(int i = 1; i <= n; ++i) {
  91. if ((1 << (tmp + 1)) < i) ++tmp;
  92. Log_2[i] = tmp;
  93. }
  94.  
  95. int tot; ll sum, ans = 0;
  96. while (m--) {
  97. tot = in();
  98. for(int i = 1; i <= tot; ++i) a[i] = in();
  99. sort(a + 1, a + tot + 1, cmp);
  100. tot = unique(a + 1, a + tot + 1) - a;
  101. --tot;
  102. for(int i = 1; i < tot; ++i) bef[i] = get_LCP(a[i], a[i + 1]);
  103.  
  104. top = 0; sum = 0; ans = 0;
  105. for(int i = 1; i < tot; ++i) {
  106. size[i] = 1;
  107. while (top && bef[i] < bef[sta[top]]) {
  108. sub(sum, 1ll * bef[sta[top]] * size[sta[top]] % p);
  109. size[i] += size[sta[top]];
  110. --top;
  111. }
  112. sta[++top] = i;
  113. add(sum, 1ll * bef[i] * size[i] % p);
  114. add(ans, sum);
  115. }
  116. printf("%lld\n", ans);
  117. }
  118.  
  119. return 0;
  120. }

再一次被自己的智商感动QAQ

【BZOJ 3879】SvT的更多相关文章

  1. 【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列+双向链表)

    1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设 ...

  2. Kruskal算法及其类似原理的应用——【BZOJ 3654】tree&&【BZOJ 3624】[Apio2008]免费道路

    首先让我们来介绍Krukal算法,他是一种用来求解最小生成树问题的算法,首先把边按边权排序,然后贪心得从最小开始往大里取,只要那个边的两端点暂时还没有在一个联通块里,我们就把他相连,只要这个图里存在最 ...

  3. 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护

    线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...

  4. LCA 【bzoj 4281】 [ONTAK2015]Związek Harcerstwa Bajtockiego

    [bzoj 4281] [ONTAK2015]Związek Harcerstwa Bajtockiego Description 给定一棵有n个点的无根树,相邻的点之间的距离为1,一开始你位于m点. ...

  5. 【BZOJ 1191】 [Apio2010]特别行动队 (斜率优化)

    dsy1911: [Apio2010]特别行动队 [题目描述] 有n个数,分成连续的若干段,每段的分数为a*x^2+b*x+c(a,b,c是给出的常数),其中x为该段的各个数的和.求如何分才能使得各个 ...

  6. 【BZOJ 1096】 [ZJOI2007]仓库建设 (斜率优化)

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3940  Solved: 1736 Description ...

  7. 【BZOJ 2132】圈地计划 && 【7.22Test】计划

    两种版本的题面 Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土 ...

  8. -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】

    [把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...

  9. 【BZOJ 1032】 [JSOI2007]祖码Zuma

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1032 [题意] [题解] /* 设f[i][j]表示从第i个珠子开始的j个珠子被消除; ...

随机推荐

  1. Java开发之文件上传

    文件上传有SmartUpload.Apache的Commons fileupload.我们今天介绍Commons fileupload的用法. 1.commons-fileupload-1.3.1.j ...

  2. 网格最短路径算法(Dijkstra & Fast Marching)

    Dijkstra算法是计算图中节点之间最短路径的经典算法,网上关于Dijkstra算法原理介绍比较多,这里不再多讲.值得一提的是,当图中节点之间的权重都为1时,Dijkstra算法就变化为一般意义上的 ...

  3. BZOJ1216[HNOI2003]操作系统 [模拟 优选队列]

    1216: [HNOI2003]操作系统 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 754  Solved: 421[Submit][Status ...

  4. Nginx反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...

  5. 自定义右键菜单中bug记录

    今天客服部提出一个Bug,拖动滚动条到底部右键表格下方的数据,然后点击拨打电话打出的是表格上面的号码,看了下代码发现bug的原因是因为获取表格中电话号码的方式是通过给tr绑定了mouseover事件, ...

  6. HTML 学习笔记 CSS3 (2D转换)

    2.scaleX(<number>) : 使用 [sx,1] 缩放矢量执行缩放操作,sx为所需参数.scaleX表示元素只在X轴(水平方向)缩放元素,他的默认值是(1,1),其基点一样是在 ...

  7. nginx缓存配置的操作记录梳理

    web缓存位于内容源Web服务器和客户端之间,当用户访问一个URL时,Web缓存服务器会去后端Web源服务器取回要输出的内容,然后,当下一个请求到来时,如果访问的是相同的URL,Web缓存服务器直接输 ...

  8. c#中序列化

    序列化(Serialization)是.NET平台的特性之一.1.为什么要序列化:首先你应该明白系列化的目的就不难理解他了.系列化的目的就是能在网络上传输对象,否则就无法实现面向对象的分布式计算.比如 ...

  9. ISAPI_Rewrite中文手册

    参考:http://blog.csdn.net/fanxiaojie119/article/details/5353186 第一章:软件介绍ISAPI_Rewrite 是一款适用于IIS的功能强大的基 ...

  10. 扩展 easyui 控件系列:为datagrid 增加过滤行

    此功能还为真正完成,起到抛砖引玉的效果,发动大家的力量把这个功能完善起来,效果图如下: 基本上就是扩展了 datagrid.view 中的onAfterRender 这个事件,具体代码如下: $.ex ...