[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)的抽象类 ...
随机推荐
- 如何设置和使用MacOS上的Microsoft Office套件
自30年前首次发布以来,Microsoft Office已成为全球最受欢迎的生产力套件之一.借助Word和Excel for Mac之类的程序,毫无疑问,MS Office套件在任何计算机上都是必须下 ...
- Python爬虫实战—— Request对象之header伪装策略
在header当中,我们经常会添加两个参数--cookie 和 User-Agent,来模拟浏览器登录,以此提高绕过后台服务器反爬策略的可能性. User-Agent获取 User-Agent可通过随 ...
- JMeter Http请求之content-type用法
转载自https://www.cnblogs.com/imyalost/p/6726795.html 本文讲三种content-type以及在Jmeter中对应的参数输入方式 第一部分:目前工作中涉及 ...
- WebBug靶场基础篇 — 02
本篇以第一人称记录这个关卡的第 1-5 关. 由于我记录的过程有点偏向于思考,所以截图截的多 = =!所以文章有点长... 下午一觉醒来,已经 4 点多了,然后开电脑,在虚拟机里,铺了铺靶场,但是毕竟 ...
- php开发面试题---2、php常用面试题二(表单提交方式中的get和post有什么区别)
php开发面试题---2.php常用面试题二(表单提交方式中的get和post有什么区别) 一.总结 一句话总结: 数据位置:get参数在url里面,post在主体里面 数据大小:get几kb,pos ...
- 屏幕左侧鼠标常驻,隐藏部分显示,文章鼠标常驻,隐藏部分隐藏(我的hexo next博客)
文章目录 如图 功能 代码 博客地址:https://mmmmmm.me 源码:https://github.com/dataiyangu?tab=repositories 如图 功能 最左侧添加透明 ...
- 广度优先搜索(Breadth First Search)
Date:2019-07-03 14:29:02 走完一层的所有房间,再走下一层,用队列实现 算法实现 /*--------------------------模版------------------ ...
- node.js 中的 fs (文件)模块
记录 fs 模块的方法及使用 1. fs.stat 获取文件大小,创建时间等信息 // 引入 fs 模块 const fs = require('fs'); fs.stat('01.fs.js', ( ...
- rpm升级时spec文件执行的流程
转自:https://www.cnblogs.com/zafu/p/7423758.html %pre 和 %post 脚本片段分别在软件包安装前和安装后执行.%preun 和 %postun 脚本片 ...
- POJ 3469 /// 最大流Dinic
题目大意: N个模块 在核A上执行花费a[i] 在核B上执行花费b[i] 有M个模块组合(d1,d2) 若d1模块与d2模块在不同核上执行需多花费w[i] 求执行所有模块所需的最小花费 挑战P237 ...