首页 > 其他分享 >AC自动机(查询)

AC自动机(查询)

时间:2024-06-04 10:29:49浏览次数:23  
标签:AC ch int ans ne 查询 ++ cnt 自动机

        上面讲了AC自动机是如何建树和建自动机的,这里要讲的是AC自动机的查询和各个数组的功能和作用。

        其实AC自动机的查询和KMP算法是及其相近的,都是一个指针跑主串,另一个指针跑ne串(这里就是回跳边)。

        话都说到这了,不妨先来看看ne的真实用处吧。上次有提过,ne数组存的其实就是最长的后缀模式串,当我们找到一个字串在主串中匹配的时候,我们并不能直接继续下去,因为如果两个单词之间存在借位的情况,我们就会忽略从而导致错误,所以我们需要记录下当前字母先前能回跳的位置,这样我们才能将我们所要的字串一网打尽,和KMP其实是完全相同的。

        那么转移边呢,我们说过我们要用一个指针去遍历树,但是我们遍历树的时候一但到头了怎么办,是不是要沿着原路反回。现在我们用一个转移边就可以节省这一部分的操作,那么为什么要把转移边建在自己回跳边的儿子上呢?其实是为了契合上面所建的回跳边,这样我们的跑主串的指针就一定会是不回退的,只需要回跳边不断操作,主串完全就是一个匹配版,不需要进行复杂的操作。

        代码如下:

int query(char *s)
{
	int ans = 0;
	
	for(int k = 0, i = 0; s[k]; k ++)
	{
		i = s[k] - 'a';
		
		for(int j = i; j && ~cnt[j]; j = ne[j])
		{
			ans += cnt[j];
			cnt[j] = -1;
		}
	}
	
	return ans;
}

        这里需要注意,我们的计数的维护,当我们找到某一个字串后,我们会加上它在Trie树中存储的个数,同时别忘了清零,否则会多加,这里用的是位运算的小技巧。 

        贴一道例题:

https://www.luogu.com.cn/problem/P3808icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P3808 

题目描述

给定 

标签:AC,ch,int,ans,ne,查询,++,cnt,自动机
From: https://blog.csdn.net/Qlarkstar/article/details/139434297

相关文章

  • 示波器的AC和DC耦合
    耦合的概念:耦合是指两个或者两个以上的电路元件和电网络等的输出和输出之间的相互影响和紧密影响,输入和输出侧之间存在能量的传输的线性。简而言之就是输入和输出之间的相互影响。示波器的耦合示波器的输入耦合属于信号直接耦合,一般有两种方式,分别是直流模式和交流模式。直流......
  • Carmack的快速开平方根倒数算法(Fast inverse square root)
    基本原理需求\(y=\frac{1}{\sqrt{x}}\)\(log(a^b×a^c)=bloga+cloga=(b+c)loga\)32位浮点表示法:二进制的科学计数法符号位1+阶码8(有符号的反码表示幂指数)+小数位23(二进制小数首位必为1,默认,只需表示小数位即可)-20240511163945890.webp)字符串形式:\(S_0​E_1​E_2​...E_7......
  • 人大金仓创建序列,查询序列,修改序列
    1.创建序列:createsequenceseq_1INCREMENTBY1MINVALUE1STARTWITH1;序列指定为列的默认值:1.1直接在CREATETABLE命令中引用序列CREATETABLEtablename(idINT4DEFAULTnextval('myserial'));1.2更改表列以将其默认值设置为序列计数器ALTERTABLEtablenameAL......
  • 算力天天说:英伟达创始人兼CEO黄仁勋在演讲中宣布Blackwell芯片已开始投产
    算力国际新闻概述如下:英伟达算力芯片新进展:英伟达创始人兼CEO黄仁勋在演讲中宣布,英伟达的最新AI算力芯片——Blackwell芯片已开始投产。英伟达预计B系列芯片将在今年带来大量营收,这意味着国内相关英伟达算力产业链公司可能会更早确认业绩。此外,英伟达还计划在2025年推出Bl......
  • 基于React的SSG静态站点渲染方案
    基于React的SSG静态站点渲染方案静态站点生成SSG-StaticSiteGeneration是一种在构建时生成静态HTML等文件资源的方法,其可以完全不需要服务端的运行,通过预先生成静态文件,实现快速的内容加载和高度的安全性。由于其生成的是纯静态资源,便可以利用CDN等方案以更低的成本和更高的......
  • 【Python】使用 Python 查询域名的 IP 地址
    我们都已经长大好多梦正在飞就像童年看到的红色的蜻蜓我们都已经长大好多梦还要飞就像现在心目中红色的蜻蜓                     ......
  • 成为MySQL DBA后,再看ORACLE数据库(六、逻辑存储结构)
    数据库的逻辑存储结构也可以叫做存储层次体系,ORACLE的存储层次体系按照层次从高到低分为:表空间(tablespace)、段(segment)、区(extent)、块(block)。熟悉数据库的逻辑存储结构可以帮助我们分析与定位数据库的空间容量问题。一、段段是表空间的主要组织结构。段就是占用存储空间的数据库......
  • Macbook怎么快速提速?CleanMyMac 轻松帮你解决
    Mac是现代人日常工作时必不可少的工具,尤其是在居家办公已经屡见不鲜的当下。视频会议、文档传送、视频剪辑等等。它在工作中扮演的角色越来越重要,所以也导致了它的流畅程度可以在很大程度上影响人们一整天的工作效率和心情。但是影响Mac的运行和响应速度的因素有很多,其中有些......
  • 【C++初阶学习】第十二弹——stack和queue的介绍和使用
    C语言栈:数据结构——栈(C语言版)-CSDN博客C语言队列:数据结构——队列(C语言版)-CSDN博客前言:在之前学习C语言的时候,我们已经学习过栈与队列,并学习过如何使用C语言来实现栈与队列,今天,我们用C++来学习这些知识,让我们探索一下其中的新的知识点目录一、stack(栈)1.栈的概述......
  • C++ tracy性能分析
    #defineTRACY_FIBERS#include"tracy/Tracy.hpp"#include"tracy/TracyC.h"constchar*fiber="job1";TracyCZoneCtxzone;inttest(){std::threadt1([]{TracyFiberEnter(fiber);TracyCZone(ctx,1);......