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

思路:

显然后缀自动机,对于每个串建一个\(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. React中Class的概念

    Class的概念 一.简介 javaScript是面向对象的编程语言,可以说所以的能够被描述的事.物或抽象的东西,都是可以是对象.而我们记录的对象,会有具有同样的属性和行为. 为了节省重写相同的代码. ...

  2. 配置Redis集群为开机自启动

    vim /etc/init.d/redisc 将下方脚本写入redisc文件中 #!/bin/sh # chkconfig: 2345 80 90 # # Simple Redis init.d sc ...

  3. STM32嵌入式开发学习笔记(二):将功能封装为库文件

    将所有的函数都堆在main.c文件里不是好的选择,庞大的代码文件会是你维护的障碍,明智的做法是,一种功能封装到一个库文件里. 库文件就是你代码开始部分写的#include<xxxx.h>里 ...

  4. robotframework+selenium2library之上传本地文件

    针对将本地的文件上传到测试系统,selenium2library提供了一个关键词 choose file choose file    jquery=*[name='Filedata']+label: ...

  5. git clone慢的解决办法

    转自:http://www.kindemh.cn/ 转自Kindem的博客 问题 大家可能都遇到过从github使用git clone指令奇慢无比的问题,网上很多人说使用代理来加速git,但是这也不是 ...

  6. Centos 7 技巧

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

  7. ECMS清除挂马以及后台升级实战(从ecms6.6~ecms7.0)

    当时状况 Windows Server 2008 R2 Enterprise + 帝国CMS6.6 + MySql   server软件: Microsoft-IIS/7.5 操作系统: WINNT ...

  8. (数据科学学习手札61)xpath进阶用法

    一.简介 xpath作为对网页.对xml文件进行定位的工具,速度快,语法简洁明了,在网络爬虫解析内容的过程中起到很大的作用,除了xpath的基础用法之外(可参考我之前写的(数据科学学习手札50)基于P ...

  9. Unity中调用Windows窗口句柄以及根据需求设置并且解决扩展屏窗体显示错乱/位置错误的Bug

    问题背景: 现在在搞PC端应用开发,我们开发中需要调用系统的窗口以及需要最大化最小化,缩放窗口拖拽窗口,以及设置窗口位置,去边框等功能 解决根据: 使用user32.dll解决 具体功能: Unity ...

  10. IPointCollection.AddPoint Method的用法

    补充指出官方帮助的一个问题. 该方法用于向环.线.面等几何中添加节点.官方帮助里是这样描述的:Adds a vertex to a Path, Ring, Polyline, or Polygon; ...