【洛谷 P5357】 【模板】AC自动机(二次加强版)(AC自动机,差分)
每次匹配都不停跳fail显然太慢了,于是在每个节点和fail指向的点连一条边,构成一棵树,在这棵树上差分一下就好了。
AC自动机 就这个算法而言其实没用想象中那么难。
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
struct Node{
    int fail, next[26], num;
}AC[200010];
int n, u, cnt;
queue <int> q;
int p[200010], vis[200010];
char a[2000010];
int f[200010];
struct Edge{
	int next, to;
}e[200010];
int head[200010], num;
inline void Add(int from, int to){
	e[++num].to = to; e[num].next = head[from]; head[from] = num;
}
void insert(int x){
    int len = strlen(a + 1), w;
    u = 0;
    for(int i = 1; i <= len; ++i){
        w = a[i] - 'a';
        if(!AC[u].next[w])
          AC[u].next[w] = ++cnt;
        u = AC[u].next[w];
    }
    f[x] = u;
}
void BuildFail(){
	u = 0;
    for(int i = 0; i < 26; ++i)
       if(AC[u].next[i])
         q.push(AC[u].next[i]);
    while(q.size()){
        u = q.front(); q.pop();
        for(int i = 0; i < 26; ++i)
           if(AC[u].next[i]){
           	 q.push(AC[u].next[i]);
             AC[AC[u].next[i]].fail = AC[AC[u].fail].next[i];
           }
           else
		     AC[u].next[i] = AC[AC[u].fail].next[i];
    }
}
void Match(){
    int len = strlen(a + 1);
    u = 0;
    for(int i = 1; i <= len; ++i){
        u = AC[u].next[a[i] - 'a'];
        ++vis[u];
    }
}
void dfs(int x){
	for(int i = head[x]; i; i = e[i].next){
		dfs(e[i].to); vis[x] += vis[e[i].to];
	}
}
int main(){
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) f[i] = i;
    for(int i = 1; i <= n; ++i){
     	scanf("%s", a + 1);
    	insert(i);
    }
    scanf("%s", a + 1);
    BuildFail();
    Match();
    for(int i = 1; i <= cnt; ++i)
       Add(AC[i].fail, i);
    dfs(0);
    for(int i = 1; i <= n; ++i)
       printf("%d\n", vis[f[i]]);
    return 0;
}
												
											【洛谷 P5357】 【模板】AC自动机(二次加强版)(AC自动机,差分)的更多相关文章
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
		
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
 - 洛谷-P5357-【模板】AC自动机(二次加强版)
		
题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...
 - 【AC自动机】洛谷三道模板题
		
[题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...
 - 洛谷-P3796-【模板】AC自动机(加强版)
		
题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,在fail边的基础上再加一个last边, ...
 - 洛谷P3375 [模板]KMP字符串匹配
		
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
 - LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
		
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
 - 洛谷P5283 & LOJ3048:[十二省联考2019]异或粽子——题解
		
https://www.luogu.org/problemnew/show/P5283 https://loj.ac/problem/3048 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子 ...
 - 洛谷P4608 [FJOI2016]所有公共子序列问题  【序列自动机 + dp + 高精】
		
题目链接 洛谷P4608 题解 建个序列自动机后 第一问暴搜 第二问dp + 高精 设\(f[i][j]\)为两个序列自动机分别走到\(i\)和\(j\)节点的方案数,答案就是\(f[0][0]\) ...
 - 洛谷.1919.[模板]A*B Problem升级版(FFT)
		
题目链接:洛谷.BZOJ2179 //将乘数拆成 a0*10^n + a1*10^(n-1) + ... + a_n-1的形式 //可以发现多项式乘法就模拟了竖式乘法 所以用FFT即可 注意处理进位 ...
 
随机推荐
- spring boot 防止重复提交
			
服务器端实现方案:同一客户端在2秒内对同一URL的提交视为重复提交 上代码吧 pom.xml <?xml version="1.0" encoding="UTF-8 ...
 - Oracle存储过程 函数 计算使用资源
			
目录 存储过程与函数 存储过程的优势 存储过程 打印语句 选择语句 函数 计算使用资源 存储过程与函数 存储过程的优势 存储过程 /* 多行注释 */ -- 单行注释 //展示错误信息 show er ...
 - 取消本地文件夹与SVN服务器的关联
			
我们在开发项目中用SVN作为版本管理工具时,从服务器下载到本地的项目是有.svn文件夹的,这个代表是与svn服务器代码相关联的,如果我们想取消本地文件夹与svn服务器的关联,那么有多种方法,这里介绍导 ...
 - 026_如何在MAC下输入主要国家货币符号?
			
由于出国旅游啥的经常会记录一些东西,不避免的会遇到各种货币符号 一. 人民币: ¥(sogo输入法切换到中文模式,然后"shift键 + 4"即可) 美元: $(sogo输入法切换 ...
 - C# winform判断窗体是否已打开
			
Form1 form; /// <summary> /// 开始检测 /// </summary> /// <param name="sender"& ...
 - Windows EXE 依赖DLL查看
			
dumpbin (这个是visual studio 提供的工具或者可以安装 Dependency Walker)来查看 DLL 依赖关系 dumpbin /dependents filename.ex ...
 - [LeetCode] 361. Bomb Enemy 炸敌人
			
Given a 2D grid, each cell is either a wall 'W', an enemy 'E' or empty '0' (the number zero), return ...
 - 用浏览器控制台抓取shodan、搜索引擎、zone-h的结果
			
0x00 前言 大部分内容来自参考连接的内容,只是一种爬取内容的思路. 在很久以前自己会有爬取zone-h做目标测试的需求,但是总是有各种反爬限制.而且个别网址还有前端自动生成内容的功能,使用Java ...
 - npm创建angular项目
			
1.首先保证你本地的 node 环境 是ok的哦. 2.安装 angular-cli 命令 npm install -g @angular/cli.安装完成后,ng version 查看版本, ...
 - python jieba
			
https://www.cnblogs.com/jiayongji/p/7119065.html 安装 pip install jieba 简单用法 结巴分词分为三种模式:精确模式(默认).全模式和搜 ...