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. linux selenium运行chrome

    chrome版本要和chromedriver版本匹配才能正常运行.

  2. 报错kernel:NMI watchdog: BUG: soft lockup - CPU#0 stuck for 26s

    近期在服务器跑大量高负载程序,造成cpu soft lockup.如果确认不是软件的问题. 解决办法: #追加到配置文件中 echo 30 > /proc/sys/kernel/watchdog ...

  3. GROUP BY 和 GROUP_CONCAT的使用

    select b.templateId,GROUP_CONCAT(c.id),a.executeResult from vrv_paw_rulestatus a, vrv_paw_terminalto ...

  4. Spark map-side-join 关联优化

    在spark中要进行join操作,如果在shuffle的时候进行join效率较低.如果满足 所需要join的表中有一张表较小,那么可以考虑在map端进行join操作. 转载:http://blog.c ...

  5. 2017.6.8 spring-ldap基本使用总结

    之前学习过spring-ldap的官方文档:2017.4.10 spring-ldap官方文档学习 现在是对实际使用的spring-ldap及使用过程中遇到的问题,进行总结. 1.spring-lda ...

  6. [Debug] Diagnose a Slow Page Using Developer Tools

    Your page is showing high CPU usage and spinning up your laptop fan, but nothing is visibly happenin ...

  7. 【高级功能】使用 Ajax

    Ajax 是现代Web 应用程序开发的一项关键工具.它让你能向服务器异步发送和接收数据,然后用 Javascript 解析. Ajax 是 Asynchronous JavaScript and XM ...

  8. go语言25个关键字总结

    var和const :变量和常量的声明var varName type 或者 varName : = valuepackage and import: 导入func: 用于定义函数和方法return ...

  9. Linux组件封装(一)中互斥锁MutexLock的封装

    本文对Linux中的pthread_mutex_t做一个简易的封装. 互斥锁主要用于互斥,互斥是一种竞争关系,主要是某一个系统资源或一段代码,一次做多被一个线程访问. 条件变量主要用于同步,用于协调线 ...

  10. odoo12新特性: 会计改进

    改进分析会计 分析会计层级结构 分析分配 分析分录增加了表格视图     ============== SPECIFICATIONS ============== a. Hierarchy  - Cr ...