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的更多相关文章

  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. 【温故而知新-Javascript】使用 Ajax

    Ajax 是现代Web 应用程序开发的一项关键工具.它让你能向服务器异步发送和接收数据,然后用 Javascript 解析. Ajax 是 Asynchronous JavaScript and XM ...

  2. URL和URI区别

         URI:Universal Resource Identifier,通用资源标识符:   URL:Uniform Resource Locator,统一资源定位符:   其中,URL是URI ...

  3. Excel实用操作

    目地 不能熟练操作Excel的程序员不是好策划. 一片区域填充相同数据 1.用鼠标框选一片区域,松开鼠标,不要点其它单元格 2.直接输入输入数据,输完之后,按Ctrl+Enter,选中的区域就会填充相 ...

  4. [No000012]编程中浮点数之什么是科学计数法

    科学记数法 把一个绝对值小于1(或者大于等于10)的实数记为a×10n的形式(其中1≤/a/<10),这种记数法叫做科学记数法. (或者大于等于10)的实数记为a×10^n的形式(其中1≤|a| ...

  5. Javascript Window的属性

    Window的属性 属性 描述 closed 获取引用窗口是否已关闭. defaultStatus 设置或获取要在窗口底部的状态栏上显示的缺省信息. dialogArguments 设置或获取传递给模 ...

  6. https证书提供商

    http://www.itrus.com.cn/verisignchina/About/aboutitrus/Index.html

  7. Android的4种文件类型Java,class,dex,apk

    Java文件-----应用程序源文件 Android本身相当一部分都是用java编写而成(基本上架构图里头蓝色的部份都是用Java开发的),android的应用必须使用java来开发 Class文件- ...

  8. Linux—C内存管理

    程序(可执行文件)存储结构与进程存储结构: 查看文件基本情况:file fileName.查看文件存储情况:size fileName(代码区text segment.全局初始化/静态数据区data ...

  9. 内裤:DataTable转Model

    public class ConvertHelper<T> where T : new() { /// <summary> /// 利用反射和泛型 /// </summa ...

  10. [转]Spring JdbcTemplate 查询分页

    原文:http://blog.csdn.net/xiaofanku/article/details/4280128 现在进行的项目由于数据库的遗留原因(设计的不堪入目)不能用hibernate.所以用 ...