ac自动机

ac自动机

	ac自动机是由树保存。原理有点类似于KMP。失配的时候,我们找到最长后缀进行继续匹配。而且这个是有一颗树保存。
	在有些题目时候,故意的KMP过不了,因为如果给你的串够多的话,KMP就是很不好使用

如图:如果我们能够构建一个树(红色代表着如果这个点失配了,会进入指向的地方)这样子会大大减少不必要的比较
在这里插入图片描述

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
struct node
{
	int next[26] = { 0 };//下一个字母
	int fail = -1;//失配指针指向
	int cnt = 0;//计算
};
vector<struct node> tree;
int index = 0;//下标
void insert(string s)
{
	int root = 0;
	int length = s.size();
	for (int i = 0; i < length; i++)
	{
		int word = s[i] - 'a';//这是哪个单词
		if (!tree[root].next[word])tree[root].next[word] = ++index;//如果没有分配一个
		root = tree[root].next[word];//改变结点
	}
	tree[root].cnt++;//最后标记一下
}
void fail()
{
	queue<int> q;
	for(int i = 0;i<26;i++)//先把root下面的结点刷新一下改为指向根节点
		if (tree[0].next[i])
		{
			int son = tree[0].next[i];
			tree[son].fail = 0;
			q.push(son);//加进来
		}
	while (!q.empty())
	{
		int father = q.front();
		q.pop();
		for (size_t i = 0; i < 26; i++)
		{
			if (tree[father].next[i])//看看哪个有字母
			{
				int now = tree[father].next[i];//now保存这个父节点的儿子下标
				int fatherfail = tree[father].fail;//找到父亲结点失配指针
				while (~fatherfail && tree[fatherfail].next[i])//如果没有到-1并且下面没有点
					fatherfail = tree[fatherfail].fail;//继续找前一个失配下标
				if (~fatherfail) tree[now].fail = tree[fatherfail].next[i];//如果下面有点就是记录一下
				else tree[now].fail = 0;//找到了根节点指向根节点
				q.push(now);

			}
		}
	}
}
int query(string s)
{
	int ans = 0;
	int root = 0;
	int length = s.size();
	for (int i = 0; i < length; i++)
	{
		int word = s[i] - 'a';
		//如果这个东西发现是没有这个儿子&&没有到达-1那么就是找失配下标
		while (!tree[root].next[word] && ~tree[root].fail)root = tree[root].fail;
		if (tree[root].next[word])root = tree[root].next[word];//如果有那么记录一下
		else continue;
		int tmp = root;
		while (~tree[tmp].fail)//回溯统计一下答案,毕竟可能匹配到hsi,也有si这个串
		{
			ans += tree[tmp].cnt;
			tmp = tree[tmp].fail;
		}
	}
	return ans;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python AC自动机是一个用于字符串匹配的算法,它可以高效地在一段文本中查找多个预定义的模式。它的实现可以使用多种库,其中包括ac自动机python和ahocorasick-python。 ac自动机python是一个对标准的ac自动机算法进行了完善和优化的实现,适用于主流的Python发行版,包括Python2和Python3。它提供了更准确的结果,并且可以通过pip进行安装,具体的安装方法可以参考官方文档或者使用pip install命令进行安装。 ahocorasick-python是另一个实现AC自动机的库,它也可以用于Python2和Python3。你可以通过官方网站或者GitHub源码获取更多关于该库的信息和安装指南。 对于AC自动机的使用,一个常见的例子是在一段包含m个字符的文章中查找n个单词出现的次数。要了解AC自动机,需要有关于模式树(字典树)Trie和KMP模式匹配算法的基础知识。AC自动机算法包括三个步骤:构造一棵Trie树,构造失败指针和模式匹配过程。在构造好AC自动机后,可以使用它来快速地在文本中查找预定义的模式,并统计它们的出现次数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [ahocorasick-python:AC自动机python的实现,并进行了优化。 主要修复了 查询不准确的问题](https://download.csdn.net/download/weixin_42122986/18825869)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Python实现多模匹配——AC自动机](https://blog.csdn.net/zichen_ziqi/article/details/104246446)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值