题意:统计本质不同的串的个数。

思路:

显然后缀自动机,对于每个串建一个\(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] 字符串的更多相关文章

  1. 字符串(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 ...

  2. [jzoj]1417.数学题

    Link https://jzoj.net/senior/#main/show/1417 Problem 当Alice在浏览数学书时,看到一个等式A=S,奇怪的是A和S并不相等.Alice发现可以通过 ...

  3. [jzoj 5178] [NOIP2017提高组模拟6.28] So many prefix? 解题报告(KMP+DP)

    题目链接: https://jzoj.net/senior/#main/show/5178 题目: 题解: 我们定义$f[pos]$表示以位置pos为后缀的字符串对答案的贡献,答案就是$\sum_{i ...

  4. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  5. 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率

    之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...

  6. java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  7. JavaScript 字符串实用常操纪要

    JavaScript 字符串用于存储和处理文本.因此在编写 JS 代码之时她总如影随形,在你处理用户的输入数据的时候,在读取或设置 DOM 对象的属性时,在操作 Cookie 时,在转换各种不同 Da ...

  8. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  9. Redis的简单动态字符串实现

    Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,sds)的抽象类 ...

随机推荐

  1. leetcode-164周赛-1268-搜索推荐系统

    题目描述: 自己的提交: class Solution: def suggestedProducts(self, products: List[str], searchWord: str) -> ...

  2. Java 基础 - System.arraycopy() 浅拷贝 深拷贝

    ref: https://blog.csdn.net/balsamspear/article/details/85069207 https://blog.csdn.net/balsamspear/ar ...

  3. 「NOI2018」屠龙勇士 解题报告

    「NOI2018」屠龙勇士 首先对于每个龙用哪个剑砍,我们可以用set随便模拟一下得到. 然后求出拿这个剑砍这条龙的答案 \[ atk_ix-p_iy=a_i \] 其中\(atk_i\)是砍第\(i ...

  4. Service3

    RAID阵列概述• 廉价冗余磁盘阵列– 通过硬件/软件技术,将多个较小/低速的磁盘整合成一个大磁盘– 阵列的价值:提升I/O效率.硬件级别的数据冗余– 不同RAID级别的功能.特性各不相同 ##### ...

  5. <iframe>框架标签的使用

    同源下 1.iframe属性设置参考:https://blog.csdn.net/xiyiyindie/article/details/53415158 2.父子页面之间元素相互操作:https:// ...

  6. python 模块-json

    1.JSON(Javascript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programming Lan ...

  7. mongodb 查询指定字段

    @AutowiredMongoDatabase database; @Overridepublic List<Grid> getAdditionalGrid(String collecti ...

  8. maven学习整理-基础知识

    1.maven认识 maven是一种自动化的构建工具,它主要解决的问题有: ①项目中的划分规则:原先我们用package或文件夹的形式来划分不同模块,导致在一个项目中存在大量的文件夹和包代码显得庞大: ...

  9. Centos 7 技巧

    查看系统版本详细信息 lsb_release -a 更改邮件MTA alternatives --config mta

  10. BOM 3.1 location对象 | history对象 | navigator对象 | 定时器 | 三大系列

    JavaScript分三个部分: 1. ECMAScript标准---基本语法 2. DOM--->Document Object Model 文档对象模型,操作页面元素的 3. BOM---& ...