[JZOJ 5129] 字符串
题意:统计本质不同的串的个数。
思路:
显然后缀自动机,对于每个串建一个\(SAM\)统计即可。
#include <bits/stdc++.h>
using namespace std;
int root;
int lst;
int tot;
const int maxn = 2000010;
const int mod = 1e9+7;
int son[maxn][26];
int fa[maxn];
int d[maxn];
int f[maxn];
inline void upd(int &x,int y) {
x += y;
if(x >= mod) x -= mod;
}
inline void extend(int c) {
int np = ++tot;
int p = lst;
d[np] = d[p] + 1;
lst = np;
for(;p && !son[p][c];son[p][c] = np,p = fa[p]);
if(!p) {
fa[np] = root;
}
else {
int q = son[p][c];
if(d[q] == d[p] + 1) {
fa[np] = q;
}
else {
int nq = ++tot;
d[nq] = d[p] + 1;
for(int i = 0;i < 26; ++i) {
son[nq][i] = son[q][i];
}
fa[nq] = fa[q];
fa[q] = fa[np] = nq;
for(;p && son[p][c] == q;son[p][c] = nq,p = fa[p]);
}
}
}
int r[maxn];
int pos[maxn];
int Order[maxn];
int n;
inline bool cmp(int a,int b) {
return pos[a] == pos[b] ? d[a] < d[b] : pos[a] < pos[b];
}
int main () {
freopen("str.in","r",stdin);
freopen("str.out","w",stdout);
scanf("%d",&n);
for(int i = 1;i <= n; ++i) {
char s[maxn];
scanf("%s",s);
int len = strlen(s);
root = ++tot;
lst = root;
r[i] = lst;
for(int j = 0;j < len; ++j) {
extend(s[j] - 'a');
}
for(int j = r[i];j <= tot; ++j) {
pos[j] = i;
}
}
r[n + 1] = tot + 1;
for(int i = n;i >= 1; --i) {
for(int j = r[i];j < r[i + 1]; ++j) {
for(int k = 0;k < 26; ++k) {
if(!son[j][k]) {
son[j][k] = son[r[i + 1]][k];
}
}
}
}
for(int i = 1;i <= tot; ++i) {
Order[i] = i;
}
sort(Order+1,Order+tot+1,cmp);
for(int i = tot;i; --i) {
int tmp = Order[i];
f[tmp] = 1;
for(int j = 0;j < 26; ++j) {
upd(f[tmp],f[son[tmp][j]]);
}
}
printf("%d\n",f[1]);
return 0;
}
[JZOJ 5129] 字符串的更多相关文章
- 字符串(AC自动机):HDU 5129 Yong Zheng's Death
Yong Zheng's Death Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/O ...
- [jzoj]1417.数学题
Link https://jzoj.net/senior/#main/show/1417 Problem 当Alice在浏览数学书时,看到一个等式A=S,奇怪的是A和S并不相等.Alice发现可以通过 ...
- [jzoj 5178] [NOIP2017提高组模拟6.28] So many prefix? 解题报告(KMP+DP)
题目链接: https://jzoj.net/senior/#main/show/5178 题目: 题解: 我们定义$f[pos]$表示以位置pos为后缀的字符串对答案的贡献,答案就是$\sum_{i ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率
之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...
- java中的字符串相关知识整理
字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...
- JavaScript 字符串实用常操纪要
JavaScript 字符串用于存储和处理文本.因此在编写 JS 代码之时她总如影随形,在你处理用户的输入数据的时候,在读取或设置 DOM 对象的属性时,在操作 Cookie 时,在转换各种不同 Da ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- Redis的简单动态字符串实现
Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,sds)的抽象类 ...
随机推荐
- 图像元数据编辑软件:MetaImage使用流程讲解
MetaImage是唯一的macOS工具,允许在处理所有类型的标签格式时编辑,读取和写入元数据.在时尚的界面中导航,您可以更改图像元数据的所有内容,并对数百张相似的照片进行相同的编辑. https:/ ...
- redis相关笔记(一.安装及单机及哨兵使用)
redis笔记一 redis笔记二 redis笔记三 1.安装 cd /usr/src #进入下载目录(这个目录自己定) yum install -y wget gcc make tcl #安装依赖 ...
- go垃圾回收
go垃圾回收 当创建一些变量时,变量有一个确定的生命周期.例如函数中定义的局部变量,当函数退出时变量就不存在了.另外在其他情况下,至少对于编译器来说,这不是那么的明显.例如,某个被函数返回的变量的生命 ...
- 【LeetCode 6】Z 字形变换
题目链接 [题解] 还想着模拟这个过程.然后发现只有行有用啊!... 那就建个rows大小的字符串数组存每行从左到右的字符就行啦.. 然后就是i从1变到n然后又变回1反复就好了. 最后把1..rows ...
- CF 1082E Increasing Frequency(贪心)
传送门 解题思路 贪心.对于一段区间中,可以将这段区间中相同的元素同时变成\(c\),但要付出的代价是区间中等于\(c\)的数的个数,设\(sum[i]\)表示等于\(c\)数字的前缀和,Max[i] ...
- C#网页数据采集(三)HttpWebRequest
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...
- error LNK2001: unresolved external symbol "public: __thiscall CWinAppEx::CWinAppEx(int)" (??0CWinApp
1.这个是网上找的别人的解决办法,本人没试过 解决办法: 网上大多说的这类似问题是解决自定义类的,可是这个连接是系统CWinAppEx,网上查了很久也没找到原因,重装了vs也没解决.后面在google ...
- JAVA调用R脚本 windwos路径下
RConnection c = new RConnection();// REXP x = c.eval("source('D:\\\\jiaoben\\\\RJava_test.R',en ...
- 剑指offer——45整数中1出现的次数
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
- 结对编程-Core 第12组 [pb15061359+pb15061351]
一.项目要求 1.输入题目数量,生成操作数为3~5个的四则运算题目 2.输入上限值控制生成的操作数的最大值以及结果的最大值 3.输入支持的操作符类型:加.减.乘.除.乘方.括号 4.输入支持的操作数类 ...