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自动机]的更多相关文章

  1. bzoj 1195 [HNOI2006]最短母串 bfs 状压 最短路 AC自动机

    LINK:最短母串 求母串的问题.不适合SAM. 可以先简化问题 考虑给出的n个字符串不存在包含关系. 那么 那么存在的情况 只可能有 两个字符串拼接起来能表示另外一个字符串 或者某个字符串的后缀可以 ...

  2. 兔子的晚会 2016Vijos省选集训 day1

    兔子的晚会 (xor.c/pas/cpp)============================= 很久很久之前,兔子王国里居住着一群兔子.每到新年,兔子国王和他的守卫总是去现场参加晚会来欢庆新年. ...

  3. 股神小L 2016Vijos省选集训 day1

    股神小L (stock.c/pas/cpp)============================ 小L厌倦了算法竞赛,希望到股市里一展身手.他凭借自己还行的计算机功底和可以的智商,成功建立一个模型 ...

  4. [BZOJ1195]:[HNOI2006]最短母串(AC自动机+BFS)

    题目传送门 题目描述 给定n个字符串(S1,S2,…,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,…,Sn)都是T的子串. 输入格式 第一行是一个正整数n,表示给定的字符串的个数 ...

  5. 「刷题笔记」AC自动机

    自动AC机 Keywords Research 板子题,同luoguP3808,不过是多测. 然后多测不清空,\(MLE\)两行泪. 板子放一下 #include<bits/stdc++.h&g ...

  6. POJ 2778 DNA Sequence(AC自动机+矩阵加速)

    DNA Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9899   Accepted: 3717 Desc ...

  7. HDU3247 Resource Archiver(AC自动机+BFS+DP)

    题目,求最短的包含所有n个DNA片段且不包含任何一个病毒片段的序列. 容易用所有DNA片段和病毒片段建一个AC自动机,构造fail时处理一下各个结点后缀是DNA或者病毒的情况,然后dp[S][u]表示 ...

  8. [BZOJ 1009] [HNOI2008] GT考试 【AC自动机 + 矩阵乘法优化DP】

    题目链接:BZOJ - 1009 题目分析 题目要求求出不包含给定字符串的长度为 n 的字符串的数量. 既然这样,应该就是 KMP + DP ,用 f[i][j] 表示长度为 i ,匹配到模式串第 j ...

  9. AC自动机模板1(【洛谷3808】)

    题面 题目背景 这是一道简单的AC自动机模版题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 题目描述 给定n个模式串和1个文本串,求有多少个模式串 ...

随机推荐

  1. 完全理解Gson(3):Gson反序列化

    完全理解Gson(2):Gson序列化 完全理解Gson(1):简单入门 本文延续前一篇文章,继续介绍简单基本的Gson用法.这篇文章我们将介绍如何将复杂的JSON对象解析为Java对象,其中Java ...

  2. python getopt学习记录

    有时候我们需要写一些脚本处理一些任务,这时候往往需要提供一些命令行参数,根据不同参数进行不同的处理,在Python里,命令行的参数和C语言很类似(因为标准Python是用C语言实现的).在C语言里,m ...

  3. ES6里关于模板字面量的拓展

    JS 的字符串相对其他语言来说功能总是有限的,事实上,ES5中一直缺乏许多特性,如多行字符串.字符串格式化.HTML转义等.ES6通过模板字面量的方式进行了填补,模板字面量试着跳出JS已有的字符串体系 ...

  4. zabbix自定义监控项二

    为zabbix增加支持传参的自定义监控项 例如使用zabbix来监控tcp的12种状态 tcp的12种状态可以通过man netstat来找到,即 LISTEN:等待从任何远端TCP 和端口的连接请求 ...

  5. hdu 4512 吉哥系列故事——完美队形I(最长公共上升自序加强版)

    首先要去学习最长公共上升子序列LCIS.然后是对n*n效率的算法进行优化,这里要注意的是能够求出来的序列中间能够有一个最高的.刚開始将输入的数组进行逆置,写下来发现这可能存在问题. 只是详细是什么也没 ...

  6. 自定义 alert 弹窗

    1.css样式 li-alert.css @-webkit-keyframes opacity { 0% { opacity: 0; /*初始状态 透明度为0*/ } 50% { opacity: 0 ...

  7. 《Microsoft Sql server 2008 Internals》读书笔记--第六章Indexes:Internals and Management(1)

    <Microsoft Sql server 2008 Internals>索引文件夹: <Microsoft Sql server 2008 Internals>读书笔记--文 ...

  8. 【VBA】查看窗口当前状态

    Excle的窗口分为:最大化,最小化,一般 使用VB代码如何查看窗口的状态呢?代码如下所示: Sub 获取窗口状态() Dim State As String State = Application. ...

  9. Oracle case when then else end的两种用法

    查询表结构 SELECT T.COLUMN_ID, T.COLUMN_NAME, (CASE WHEN (T.DATA_TYPE = 'VARCHAR2' OR T.DATA_TYPE = 'RAW' ...

  10. 初探J2EE

    还记得在技术交流会上八期给我们讲的J2EE,当时就是云里来屋里去.留在自己脑子中的仅仅有两个字"规范",其他的真是一无全部. 可是如今学了后,又在脑子里留下了两个字"规范 ...