串 2016Vijos省选集训 day3[AC自动机]
1、串(string.c/.cpp/.pas)
限时1s,内存限制256MB,20个测试点
【题目描述】
兔子们在玩字符串的游戏。首先,它们拿出了一个字符串集合S,然后它们定义一个字符串为“好”的,当且仅当它可以被分成非空的两段,其中每一段都是字符串集合S中某个字符串的前缀。
比如对于字符串集合{"abc", "bca"},字符串"abb","abab"是“好”的("abb" = "ab"+"b", abab = "ab" + "ab"),而字符串“bc”不是“好”的。
兔子们想知道,一共有多少不同的“好”的字符串。
【输入格式】
第一行一个整数n,表示字符串集合中字符串的个数
接下来每行一个字符串
【输出格式】
一个整数,表示有多少不同的“好”的字符串
【样例输入】
2
ab
ac
【样例输出】
9
【数据规模】
对于20%的数据,1 <= n <= 200
对于50%的数据,1 <= n <= 2000
对于100%的数据,1 <= n <= 10000,每个字符串非空且长度不超过30,均为小写字母组成。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std; #ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif
#define FRE(name) freopen(#name".in","r",stdin);freopen(#name".out","w",stdout);
#define FC fclose(stdin);fclose(stdout); typedef long long ll;
const int N=3e5+; int n,L,len,cnt,tr[N][],d[N][],num[N],fail[N],q[N];
char s[];
ll ans,f[][N];
void insert(){
int now=;
for(int i=;i<len;i++){
int t=s[i]-'a';
if(!tr[now][t]) tr[now][t]=++cnt,num[cnt]=num[now]+;
now=tr[now][t];
}
}
void AC_mach(){
int h=,t=;int p;
q[]=;fail[]=;
while(h!=t){
int now=q[++h];
for(int i=;i<;i++){
if(tr[now][i]){
p=fail[now];
while(!tr[p][i]) p=fail[p];
fail[tr[now][i]]=tr[p][i];
q[++t]=tr[now][i];
}
else{
p=fail[now];
while(!tr[p][i]) p=fail[p];
tr[now][i]=tr[p][i];
d[now][i]=;
}
}
}
}
void first(){
cnt=;ans=;
for(int i=;i<;i++) tr[][i]=;
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%s",s);
len=strlen(s);
L=max(L,len);
insert();
}
}
void solve(){
AC_mach();
for(int i=;i<=cnt;i++){
if(fail[i]!=) ans++;
for(int j=;j<;j++){
if(tr[i][j]!=&&d[i][j]){
f[][tr[i][j]]++;
}
}
}
for(int i=;i<=L;i++){
for(int j=;j<=cnt;j++){
if(f[i][j]){
ans+=f[i][j];
for(int k=;k<;k++){
if(num[tr[j][k]]>=i+){
f[i+][tr[j][k]]+=f[i][j];
}
}
}
}
}
printf(LL,ans);
}
int main(){
FRE(string)
first();
solve();
FC
return ;
}
串 2016Vijos省选集训 day3[AC自动机]的更多相关文章
- bzoj 1195 [HNOI2006]最短母串 bfs 状压 最短路 AC自动机
LINK:最短母串 求母串的问题.不适合SAM. 可以先简化问题 考虑给出的n个字符串不存在包含关系. 那么 那么存在的情况 只可能有 两个字符串拼接起来能表示另外一个字符串 或者某个字符串的后缀可以 ...
- 兔子的晚会 2016Vijos省选集训 day1
兔子的晚会 (xor.c/pas/cpp)============================= 很久很久之前,兔子王国里居住着一群兔子.每到新年,兔子国王和他的守卫总是去现场参加晚会来欢庆新年. ...
- 股神小L 2016Vijos省选集训 day1
股神小L (stock.c/pas/cpp)============================ 小L厌倦了算法竞赛,希望到股市里一展身手.他凭借自己还行的计算机功底和可以的智商,成功建立一个模型 ...
- [BZOJ1195]:[HNOI2006]最短母串(AC自动机+BFS)
题目传送门 题目描述 给定n个字符串(S1,S2,…,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,…,Sn)都是T的子串. 输入格式 第一行是一个正整数n,表示给定的字符串的个数 ...
- 「刷题笔记」AC自动机
自动AC机 Keywords Research 板子题,同luoguP3808,不过是多测. 然后多测不清空,\(MLE\)两行泪. 板子放一下 #include<bits/stdc++.h&g ...
- POJ 2778 DNA Sequence(AC自动机+矩阵加速)
DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9899 Accepted: 3717 Desc ...
- HDU3247 Resource Archiver(AC自动机+BFS+DP)
题目,求最短的包含所有n个DNA片段且不包含任何一个病毒片段的序列. 容易用所有DNA片段和病毒片段建一个AC自动机,构造fail时处理一下各个结点后缀是DNA或者病毒的情况,然后dp[S][u]表示 ...
- [BZOJ 1009] [HNOI2008] GT考试 【AC自动机 + 矩阵乘法优化DP】
题目链接:BZOJ - 1009 题目分析 题目要求求出不包含给定字符串的长度为 n 的字符串的数量. 既然这样,应该就是 KMP + DP ,用 f[i][j] 表示长度为 i ,匹配到模式串第 j ...
- AC自动机模板1(【洛谷3808】)
题面 题目背景 这是一道简单的AC自动机模版题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 题目描述 给定n个模式串和1个文本串,求有多少个模式串 ...
随机推荐
- linux的dd命令详解
一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 块大小可以使用的计量表 参数注释: 1. if=文件名:输入文件名,缺省为标准输入stdin.即指定源文件.< ...
- kibana显示elasticsearch集群中flume到入的日志
日志通过flume导入elasticsearch集群见这里:flume 日志导入elasticsearch kibana介绍 kibana主页 kibana是一个功能强大的elasticsearch数 ...
- java学习笔记——大数据操作类
java.math包中提供了两个大数字操作类:BigInteger(大整数操作类) BigDecimal(大小数操作类). 大整数操作类:BigInteger BigInteger类构造方法:publ ...
- 批量扫描IP端口程序 (适用于window&linux)
批量扫描IP端口,根据扫描IP导出IP命名的文件的结果.假设1.txt文件内容为127.0.0.1192.168.1.1然后我们获取文件内容IP进行扫描window .bat版本 :1.txt为文件名 ...
- Font Awesome入门教程
Font Awesome 图标 Font Awesome 是一套绝佳的图标字体库和CSS框架. Font Awesome 字体为您提供可缩放矢量图标,它可以被定制大小.颜色.阴影以及任何可以用CSS的 ...
- 最简单的基于FFmpeg的移动端样例附件:Android 自带播放器
===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...
- linux LVS (keepalived+ipvsadm)负载均衡搭建
ipsvadm 配置 一:安装配置 LVS+DR+Keepalivedclient 访问的地址 VIP 192.168.133.100 负载服务器master真实IP 192 ...
- Dictionary及KeyValuePair使用
/// <summary> /// 除去数组中的空值和签名参数并以字母a到z的顺序排序 /// </summary> /// <param name="dicA ...
- 使用程序修改系统(IE)代理设置
文章都是发布在github再转到这边的,这边格式可能会乱掉.博客地址:benqy.com 这是本人在做的一个前端开发调试工具(HttpMock),功能是web服务器+http日记+http代理(类似f ...
- mysql合并同一列的值
我有例如以下的查询条件显示: 我希望终于显示的效果如图: 将id同样的group_name合并到一行.实现方法:在group_name前面加keywordgroup_concat.然后在sql语句 ...