首页 > 其他分享 >AC自动机

AC自动机

时间:2023-05-20 09:01:38浏览次数:33  
标签:AC 匹配 int maxs fail 自动机

前言

在学习AC自动机前,请确保已经学习并能熟练运用:

  • KMP匹配

  • 字典树

引入

在漫长的OI路途,我们难免要接触到一种叫字符串的东西。

在解决关于字符串的问题时,我们又难免要解决两个字符串匹配的问题,

比如,在一个字符串s中,字符串t出现了多少次 这些问题。(详见KMP匹配)

而在OI路途也不是一直可以一帆风顺的,万恶的出题人绝对不会总让你只匹配一个字符串,他们肯定要想方设法提高些难度,比如一个文本串匹配多个匹配串……

显然,这时候我们不可能对着那么多个字符串一个一个的做KMP,这时候就要用到本文的内容:AC自动机

AC自动机

AC自动机是建立在字典树和KMP思想上的产物,从某种意义上来说,KMP匹配也是AC自动机的一种特殊情况(字典树只有一条链的时候)。

它通过建立所有匹配串的字典树,在每个节点建立失配指针fail来将各节点联系起来。

指针fail指向的是当前串最长后缀的节点,这样可以保证沿着fail一直跳下去,不会漏掉任何一个后缀节点。

在文本串匹配时,对于文本串的每一个前缀串,通过跳fail指针将其后缀串全部搜一遍,累加答案即可。


P3808 【模板】AC 自动机(简单版)

code:

#include<bits/stdc++.h>
using namespace std;

const int maxn=1e6+5,maxs=1e6+5;

int n,f[maxs][27],root=0,cnt=0;
int add[maxs],fail[maxs];
string s;

void insert(string s) {
	int now=root;
	for(int i=0;i<s.size();i++) {
		int c=s[i]-'a';
		if(!f[now][c]) f[now][c]=++cnt;
		now=f[now][c];
	}
	add[now]++;
	return ;
}

void build() {
	queue<int>q;
	for(int i=0;i<26;i++)
		if(f[root][i]) q.push(f[root][i]);
	while(!q.empty()) {
		int now=q.front();
		q.pop();
		for(int i=0;i<26;i++)
			if(f[now][i]) {
				fail[f[now][i]]=f[fail[now]][i];
				q.push(f[now][i]);
			}
			else f[now][i]=f[fail[now]][i];
	}
	return ;
}

int query(string s) {
	int now=root,re=0;
	for(int i=0;i<s.size();i++) {
		now=f[now][s[i]-'a'];
		for(int j=now;j&&add[j]!=-1;j=fail[j])
			re+=add[j],add[j]=-1;
	}
	return re;
}

int main() {
	cin>>n;
	for(int i=1;i<=n;i++) {
		cin>>s;
		insert(s);
	}
	build();
	cin>>s;
	cout<<query(s);
	return 0;
}

P5357 【模板】AC 自动机(二次加强版)

code:

#include<bits/stdc++.h>
using namespace std;

const int maxn=2e5+5,maxs=2e5+5;

int n,ch[maxs][26],cnt=0,root=0,num[maxs],fail[maxs],idx[maxn];
string s[maxn],t;
vector<int>edge[maxs];

void insert(string s,int id) {
	int now=root;
	for(int i=0;i<s.size();i++) {
		int c=s[i]-'a';
		if(!ch[now][c]) ch[now][c]=++cnt;
		now=ch[now][c];
	}
	idx[id]=now;
	return ;
}

void build() {
	queue<int>q;
	for(int i=0;i<26;i++)
		if(ch[root][i]) q.push(ch[root][i]),edge[root].push_back(ch[root][i]);
	while(!q.empty()) {
		int now=q.front();
		q.pop();
		for(int i=0;i<26;i++) {
			if(ch[now][i]) {
				fail[ch[now][i]]=ch[fail[now]][i];
				edge[ch[fail[now]][i]].push_back(ch[now][i]);
				q.push(ch[now][i]);
			}
			else ch[now][i]=ch[fail[now]][i];
		}
	}
	return ;
}

void query(string s) {
	int now=root;
	for(int i=0;i<s.size();i++) {
		int c=s[i]-'a';
		now=ch[now][c];
		num[now]++;
	}
	return ;
}

void dfs(int now) {
	for(int i=0;i<edge[now].size();i++)
		dfs(edge[now][i]),num[now]+=num[edge[now][i]];
	return ;
}

int main() {
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>s[i],insert(s[i],i);
	build();
	cin>>t;
	query(t);
	dfs(root);
	for(int i=1;i<=n;i++)
		cout<<num[idx[i]]<<endl;
	return 0;
}

标签:AC,匹配,int,maxs,fail,自动机
From: https://www.cnblogs.com/wonder-land/p/17416727.html

相关文章

  • 记一次 Oracle 下的 SQL 优化过程
    1.介绍事情是这样的,UAT环境的测试小伙伴向我扔来一个小bug,说是一个放大镜的查询很慢,转几分钟才出数据,我立马上开发环境试了一下,很快啊我说......
  • Autodesk Maya 2024 for Mac软件安装包Maya2024Mac安装教程支持M1/M2芯片
    安装步骤1,双击打开下载好的安装包。2,选择installmaya2024双击打开启动安装程序。3,点击打开。4,安装准备中...5,输入电脑密码。6,勾选同意使用条款,然后点击下一步。7,点击下一步。8,点击安装。9,软件安装中,耐心等待一会...10,安装结束点击,关闭。11,返回打开的镜像,选择补丁双击打开它。12......
  • Autodesk AutoCAD 2024 Mac软件安装包下载CAD 2024Mac安装教程
    安装步骤1,双击打开下载好的安装包。2,选择installAutodeskAutoCAD2024forMac双击打开启动安装程序。3,选择打开。4,安装准备中...5,输入电脑密码。6,勾选我同意使用条款,然后下一步。7,点击【安装】。8,软件安装中...9,安装结束关闭安装页面。10,返回到打开的镜像选择补丁双击打开。11,将......
  • 2023春ACM组队训练1
    训练地址:训练一具体代码见提交B.明明的字符串可见abc242E求解小于等于一个字符串的回文串的个数就是有一个小小的区别,一个判断是小于等于,一个是小于 cin>>n>>k>>ss; rss=ss; lll=ss.size(),sum=0,len=l; l=(l-1)/2; for(inti=0;i<=l;++i){ rss[len-1-i]=rss[i]; s......
  • Packet tracer 8.2.1注册及使用
    除了不需要登录的版本,所有需要登录的版本在中国大陆只能使用Packettracer8.2.1及以上,使用中国大陆专门的服务器。下面逐步介绍注册使用步骤:1、打开网址:CiscoPacketTracer|NetworkingAcademy(netacad.cn)2、点击进入注册界面 3、跟着引导一步一步注册 4、成功Submi......
  • Unity的UGUI用TexturePacker全自动打图集,包括九宫格切图信息
    @TOC前言最近在学习UGUI的打图集,之前一直在用SpritePacker和SpriteAtlas打图集,现在记录下另一种打图集方式:TexturePacker主要是讲如何自动打图集到Unity,并且不丢掉九宫格信息,以及一些参数的设置环境准备1.unity版本2019.4.10f12.TexturePacker安装官网,支持正版,支持正版,支持正版ht......
  • Nacos 核心原理解读+高性能微服务系统实战
    Nacos核心原理解读+高性能微服务系统实战download:3w51xuebccom《模拟人生4》(TheSims4)是一款由Maxis和TheSimsStudio开发,由ElectronicArts发行的模拟人生游戏。它被广泛认为是模拟人生系列中最好玩的一部分。本文将向您介绍TS4的入门知识。TS4的基本概念在TS4中,你可以创建......
  • docker部署nacos2.2
    docker-startup.sh#!/bin/bash#Copyright1999-2018AlibabaGroupHoldingLtd.#LicensedundertheApacheLicense,Version2.0(the"License");#youmaynotusethisfileexceptincompliancewiththeLicense.#YoumayobtainacopyoftheLi......
  • 【Anaconda3】pytorch环境配置记录(CPU版本)
    安装Anaconda官网传送门点下载即可,默认下载最新版下载旧版可以去:开源镜像传送门创建Pytorch环境先在开始菜单栏打开然后输入condacreate-npytorchpython=本机Python版本号查看本机python版本按win+R输入cmd打开命令行,输入python查看python版本,版本多少上图红框中p......
  • xpath解析使用extract()的各种情况分析
    返回一个SelectorList对象 http://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/selectors.html#selectorlistSelectorList类是内建list类的子类,提供了一些额外的方法:xpath(query)css(query)extract()re()__nonzero__()返回一个list(就是系统自带的那个)里面是一些你......