【BZOJ 3879】SvT
http://www.lydsy.com/JudgeOnline/problem.php?id=3879
SvT的中文是后缀虚树?
反正本蒟蒻不懂,还是$O(nlogn)$的后缀数组和单调栈维护来做,fye学姐讲了这种学法(当时并没有听懂QwQ),xiaoyimi教会了我这种做法→xiaoyimi的题解。
一开始贡献了2次TLE,以为是玄学的死循环,果断挂起对拍器拍了一晚上,然后在回家的路上才想起来TLE是因为提交的时候忘删freopen了
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- typedef long long ll;
- const int N = 500003;
- const ll p = 23333333333333333ll;
- int in() {
- int k = 0, fh = 1; char c = getchar();
- for(; c < '0' || c > '9'; c = getchar())
- if (c == '-') fh = -1;
- for(; c >= '0' && c <= '9'; c = getchar())
- k = (k << 3) + (k << 1) + c - '0';
- return k * fh;
- }
- int c[N], t1[N], t2[N];
- void st(int *x, int *y, int *sa, int n, int m) {
- for(int i = 0; i < m; ++i) c[i] = 0;
- for(int i = 0; i < n; ++i) ++c[x[y[i]]];
- for(int i = 1; i < m; ++i) c[i] += c[i - 1];
- for(int i = n - 1; i >= 0; --i) sa[--c[x[y[i]]]] = y[i];
- }
- void mkhz(int *r, int *sa, int n, int m) {
- int *x = t1, *y = t2, *t, p, i, j;
- for(i = 0; i < n; ++i) x[i] = r[i], y[i] = i;
- st(x, y, sa, n, m);
- for(p = 1, j = 1; p < n; m = p, j <<= 1) {
- for(p = 0, i = n - j; i < n; ++i) y[p++] = i;
- for(i = 0; i < n; ++i) if (sa[i] >= j) y[p++] = sa[i] - j;
- st(x, y, sa, n, m);
- for(t = x, x = y, y = t, p = 1, x[sa[0]] = 0, i = 1; i < n; ++i)
- x[sa[i]] = y[sa[i]] == y[sa[i - 1]] && y[sa[i] + j] == y[sa[i - 1] + j] ? p - 1 : p++;
- }
- }
- void mkh(int *r, int *sa, int *rank, int *h, int n) {
- int k = 0, j, i;
- for(i = 0; i < n; ++i) rank[sa[i]] = i;
- for(i = 1; i < n; h[rank[i++]] = k)
- for(k ? --k : 0, j = sa[rank[i] - 1]; r[i + k] == r[j + k]; ++k);
- }
- char s[N];
- int n, m, sa[N], rank[N], r[N], h[N], f[N][20], Log_2[N], a[N];
- int get_min(int l, int r) {
- int len = Log_2[r - l];
- return min(f[l][len], f[r - (1 << len)][len]);
- }
- int get_LCP(int l, int r) {
- l = rank[l]; r = rank[r];
- if (l > r) swap(l, r);
- return get_min(l, r);
- }
- bool cmp(int x, int y) {
- return rank[x] < rank[y];
- }
- int sta[N], top, bef[N], size[N];
- void sub(ll &x, ll y) {
- x -= y; if (x < 0) x += p;
- }
- void add(ll &x, ll y) {
- x += y; if (x > p) x -= p;
- }
- int main() {
- n = in(); m = in();
- scanf("%s", s + 1);
- r[0] = 0;
- for(int i = 1; i <= n; ++i) r[i] = s[i] - 'a' + 1;
- mkhz(r, sa, n + 1, 27);
- mkh(r, sa, rank, h, n + 1);
- for(int i = 0; i < n; ++i) f[i][0] = h[i + 1];
- for(int j = 1; j < 20; ++j)
- for(int i = 0; i < n; ++i) {
- if (i + (1 << (j - 1)) >= n) break;
- f[i][j] = min(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
- }
- int tmp = 0;
- for(int i = 1; i <= n; ++i) {
- if ((1 << (tmp + 1)) < i) ++tmp;
- Log_2[i] = tmp;
- }
- int tot; ll sum, ans = 0;
- while (m--) {
- tot = in();
- for(int i = 1; i <= tot; ++i) a[i] = in();
- sort(a + 1, a + tot + 1, cmp);
- tot = unique(a + 1, a + tot + 1) - a;
- --tot;
- for(int i = 1; i < tot; ++i) bef[i] = get_LCP(a[i], a[i + 1]);
- top = 0; sum = 0; ans = 0;
- for(int i = 1; i < tot; ++i) {
- size[i] = 1;
- while (top && bef[i] < bef[sta[top]]) {
- sub(sum, 1ll * bef[sta[top]] * size[sta[top]] % p);
- size[i] += size[sta[top]];
- --top;
- }
- sta[++top] = i;
- add(sum, 1ll * bef[i] * size[i] % p);
- add(ans, sum);
- }
- printf("%lld\n", ans);
- }
- return 0;
- }
再一次被自己的智商感动QAQ
【BZOJ 3879】SvT的更多相关文章
- 【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列+双向链表)
1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设 ...
- Kruskal算法及其类似原理的应用——【BZOJ 3654】tree&&【BZOJ 3624】[Apio2008]免费道路
首先让我们来介绍Krukal算法,他是一种用来求解最小生成树问题的算法,首先把边按边权排序,然后贪心得从最小开始往大里取,只要那个边的两端点暂时还没有在一个联通块里,我们就把他相连,只要这个图里存在最 ...
- 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护
线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...
- LCA 【bzoj 4281】 [ONTAK2015]Związek Harcerstwa Bajtockiego
[bzoj 4281] [ONTAK2015]Związek Harcerstwa Bajtockiego Description 给定一棵有n个点的无根树,相邻的点之间的距离为1,一开始你位于m点. ...
- 【BZOJ 1191】 [Apio2010]特别行动队 (斜率优化)
dsy1911: [Apio2010]特别行动队 [题目描述] 有n个数,分成连续的若干段,每段的分数为a*x^2+b*x+c(a,b,c是给出的常数),其中x为该段的各个数的和.求如何分才能使得各个 ...
- 【BZOJ 1096】 [ZJOI2007]仓库建设 (斜率优化)
1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3940 Solved: 1736 Description ...
- 【BZOJ 2132】圈地计划 && 【7.22Test】计划
两种版本的题面 Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土 ...
- -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】
[把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...
- 【BZOJ 1032】 [JSOI2007]祖码Zuma
[题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1032 [题意] [题解] /* 设f[i][j]表示从第i个珠子开始的j个珠子被消除; ...
随机推荐
- Java开发之文件上传
文件上传有SmartUpload.Apache的Commons fileupload.我们今天介绍Commons fileupload的用法. 1.commons-fileupload-1.3.1.j ...
- 网格最短路径算法(Dijkstra & Fast Marching)
Dijkstra算法是计算图中节点之间最短路径的经典算法,网上关于Dijkstra算法原理介绍比较多,这里不再多讲.值得一提的是,当图中节点之间的权重都为1时,Dijkstra算法就变化为一般意义上的 ...
- BZOJ1216[HNOI2003]操作系统 [模拟 优选队列]
1216: [HNOI2003]操作系统 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 754 Solved: 421[Submit][Status ...
- Nginx反向代理、负载均衡、页面缓存、URL重写及读写分离详解
大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...
- 自定义右键菜单中bug记录
今天客服部提出一个Bug,拖动滚动条到底部右键表格下方的数据,然后点击拨打电话打出的是表格上面的号码,看了下代码发现bug的原因是因为获取表格中电话号码的方式是通过给tr绑定了mouseover事件, ...
- HTML 学习笔记 CSS3 (2D转换)
2.scaleX(<number>) : 使用 [sx,1] 缩放矢量执行缩放操作,sx为所需参数.scaleX表示元素只在X轴(水平方向)缩放元素,他的默认值是(1,1),其基点一样是在 ...
- nginx缓存配置的操作记录梳理
web缓存位于内容源Web服务器和客户端之间,当用户访问一个URL时,Web缓存服务器会去后端Web源服务器取回要输出的内容,然后,当下一个请求到来时,如果访问的是相同的URL,Web缓存服务器直接输 ...
- c#中序列化
序列化(Serialization)是.NET平台的特性之一.1.为什么要序列化:首先你应该明白系列化的目的就不难理解他了.系列化的目的就是能在网络上传输对象,否则就无法实现面向对象的分布式计算.比如 ...
- ISAPI_Rewrite中文手册
参考:http://blog.csdn.net/fanxiaojie119/article/details/5353186 第一章:软件介绍ISAPI_Rewrite 是一款适用于IIS的功能强大的基 ...
- 扩展 easyui 控件系列:为datagrid 增加过滤行
此功能还为真正完成,起到抛砖引玉的效果,发动大家的力量把这个功能完善起来,效果图如下: 基本上就是扩展了 datagrid.view 中的onAfterRender 这个事件,具体代码如下: $.ex ...