码题集-AC自动机(模板)

AC自动机:

(1)一个长串,多个短串,求长串中匹配了几个短串(包括分别匹配了几个,总共匹配了几类)

(2)此处模板为长串中匹配了几个短串;

(3)复杂度为O(n);

(4)理论基础

  1. Trie树
  2. KMP
  3. 链表

思路:

(1)问题分析:给定1e6模式长串,多个短串,求其中匹配的各模式串中个数最大者及其个数;

(2)分析:多模式串匹配问题,考虑AC自动机;

(3)过程:

  1. 建立string数组与int数组统计短串及其个数;
  2. 先建立短串与标记的map映射;
  3. 对于多个子串,建立Trie树,并将短串在Trie树中的终点映射到短串标记;
  4. 建立链式关系;
  5. 查询时查到后对该节点对应短串进行计数;
  6. 找到最大出现次数及其节点;

代码:


#include <queue>
#include <cstdlib>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#include<map>
using namespace std;
typedef long long ll;
const int maxn =  2*1e6+9;int trie[maxn][26]; //字典树
int cntword[maxn];  //记录该单词出现次数
int fail[maxn];     //失败时的回溯指针
int cnt = 0;
int n;
string s;
map<string,int> qq;
map<int,int> node_i;
int ccnt[50];
string ss[50];void insertWords(string s)
{int root = 0;for(int i=0;i<s.size();i++){int next = s[i] - 'a';if(!trie[root][next])trie[root][next] = ++cnt;root = trie[root][next];}cntword[root]++;      //当前节点单词数+1int s_n = qq[s];node_i[root] = s_n;
}
void getFail(){queue <int>q;for(int i=0;i<26;i++){      //将第二层所有出现了的字母扔进队列if(trie[0][i]){fail[trie[0][i]] = 0;q.push(trie[0][i]);}}//fail[now]    ->当前节点now的失败指针指向的地方
//tire[now][i] -> 下一个字母为i+'a'的节点的下标为tire[now][i]while(!q.empty()){int now = q.front();q.pop();for(int i=0;i<26;i++){      //查询26个字母if(trie[now][i]){//如果有这个子节点为字母i+'a',则
//让这个节点的失败指针指向(((他父亲节点)的失败指针所指向的那个节点)的下一个节点)//有点绕,为了方便理解特意加了括号fail[trie[now][i]] = trie[fail[now]][i];q.push(trie[now][i]);}else//否则就让当前节点的这个子节点//指向当前节点fail指针的这个子节点trie[now][i] = trie[fail[now]][i];}}
}void query(string s)
{int now = 0,ans = 0;for(int i=0;i<s.size();i++){    //遍历文本串now = trie[now][s[i]-'a'];  //从s[i]点开始寻找for(int j=now;j && cntword[j]!=-1;j=fail[j]){//一直向下寻找,直到匹配失败(失败指针指向根或者当前节点已找过).ans += cntword[j];if(cntword[j] > 0){int t = node_i[j];ccnt[t] += 1; }}}
}void solve()
{cnt = 0;memset(trie,0,sizeof trie);memset(cntword,0,sizeof cntword);memset(fail,0,sizeof fail);memset(ccnt,0,sizeof ccnt);node_i.clear();qq.clear();for(int i=0;i<n;i++){cin >> s ;qq[s] = i;ss[i] = s; insertWords(s);}fail[0] = 0;getFail();cin >> s ;query(s);int maxn = 0;for(int i = 0;i < n;i ++){maxn = max(maxn,ccnt[i]);}cout << maxn << endl;for(int i = 0;i < n;i ++){if(ccnt[i] == maxn){cout << ss[i] << endl;}}} int main() 
{while(cin >> n,n != 0){solve();	 	}   return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/182209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

异步操作的方法

在高级语言中已经有了异步的原语言&#xff0c;而在C 中的最好的方式就是 libevent 的方式,我这还是相当认同的&#xff0c;高级语言就不需要在苦哈哈的&#xff0c;事件转圈了&#xff0c;但是原理还是以事件为基础的 一句话就是在一个循环中等着他执行完,这个循环中有很多其他…

NX二次开发UF_CURVE_create_arc_thru_3pts 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_create_arc_thru_3pts Defined in: uf_curve.h int UF_CURVE_create_arc_thru_3pts(int create_flag, double first_point [ 3 ] , double second_point [ 3 ] , double th…

单调队列(算法)

单调队列是求解区间最大值或最小值的算法 正向遍历时&#xff0c;是先入后出 , 队列中的下标是按照从左往右递增 , 由于正向遍历&#xff0c;当前下标比之前下标大&#xff0c;所以与末尾值比较 &#xff0c; 并且入列时添加在末尾 , 出列弹出队首 class Solution:def maxSli…

Git提示 Connection closed by remote host

问题如下图&#xff1a; 解决&#xff1a; 删除./ssh目录下的config文件&#xff0c;如下图config文件是新增的 原因&#xff1a;不知道什么原因&#xff0c;连接外网后突然断开或导致自动增加config文件。

【Python】jieba分词基础

jieba分词主要有3种模式&#xff1a; 1、精确模式&#xff1a;jieba.cut(文本, cut_allFalse) 2、全模式&#xff1a;jieba.cut(文本, cut_allTrue) 3、搜索引擎模式&#xff1a;jieba.cut_for_search(文本) 分词后的关键词提取&#xff1a; jieba.analyse.textrank(txt,t…

算法通关村第十三关|黄金挑战|数论问题

1.辗转相除法&#xff08;欧几里得算法&#xff09; 假如 8 和 12 的最大公因数是 4 &#xff0c;就记作 gcd(8,12)4. 辗转相除法重要规则&#xff1a;若 r 是 ab 的余数&#xff0c;则 gcd(a,b)gcd(b,r) 。 基于该规则的代码实现&#xff1a; int gcd(int a, int b) {int …

PPP/INS紧组合代码学习

前言&#xff1a; 本文是基于IGNAV的PPP/INS紧组合学习&#xff0c;在此之前需要具备GNSS/INS松组合知识&#xff0c;武汉大学的i2nav实验室的KF-GINS项目可以作为学习模板。可以参考这篇优秀博文&#xff0c;链接&#xff1a;KF-GINS源码阅读_李郑骁学导航的博客-CSDN博客 IG…

Kubernetes技术与架构-安全性

本文主要从不同层面与多个维度描述Kubernetes技术与架构的安全性。 云原生的安全性 从系统分层架构的角度分析&#xff0c;自底向上&#xff0c;云原生的安全性主要包括云、集群、容器以及代码四个层面&#xff0c;简称云原生4C安全&#xff0c;其架构图如下所示&#xff1a;…

Vue3水印(Watermark)

APIs 参数说明类型默认值必传width水印的宽度&#xff0c;默认值为 content 自身的宽度numberundefinedfalseheight水印的高度&#xff0c;默认值为 content 自身的高度numberundefinedfalserotate水印绘制时&#xff0c;旋转的角度&#xff0c;单位 number-22falsezIndex追加…

ubuntu系统进入休眠后cuda初始化报错

layout: post # 使用的布局&#xff08;不需要改&#xff09; title: torch.cuda.is_available()报错 # 标题 subtitle: ubuntu系统进入休眠后cuda初始化报错 #副标题 date: 2023-11-29 # 时间 author: BY ThreeStones1029 # 作者 header-img: img/about_bg.jpg #这篇文章标题背…

解锁Jira本地部署的数据中心版高级功能,打造高效、智能、精细化的项目管理

近日&#xff0c;在龙智携手Atlassian与JFrog共同举办的“大规模开发创新&#xff1a;如何提升企业级开发效率与质量”的线下研讨会中&#xff0c;龙智高级咨询顾问、Atlassian认证专家叶燕秀为大家带来了精彩演讲&#xff0c;解锁Jira Data Center版的诸多高级功能&#xff0c…

【LeetCode刷题-字符串】--71.简化路径

71.简化路径 思路&#xff1a; 对于给定的字符串&#xff0c;先根据/分割成一个由若干字符串组成的列表&#xff0c;记为names&#xff0c;根据题意names中包含的字符串只能是以下几种&#xff1a; 空字符串一个点两个点只包含英文字母、数字或_的目录名 对于空字符串和一个…

Windows下命令行启动与关闭WebLogic的相关服务

WebLogic 的服务器类型 WebLogic提供了三种类型的服务器&#xff1a; 管理服务器节点服务器托管服务器 示例和关系如下图&#xff1a; 对应三类服务器&#xff0c; 就有三种启动和关闭的方式。本篇介绍使用命令行脚本的方式启动和关闭这三种类型的服务器。 关于WebLogic 的…

分析某款go端口扫描器之一

一、概述 进来在学go的端口检测部分&#xff0c;但是自己写遇到很多问题&#xff0c;又不知道从何入手&#xff0c;故找来网上佬们写的现成工具&#xff0c;学习一波怎么实现的。分析过程杂乱&#xff0c;没啥思路&#xff0c;勿喷。 项目来源&#xff1a;https://github.com/…

Python与设计模式--设计原则

23种计模式之 前言 &#xff08;5&#xff09;单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、&#xff08;11&#xff09;策略模式、责任链模式、命令模式、中介者模…

二分查找(折半查找)探究学习

1.引入 当我们想要查找在一个数组中某一个特定的数它的下标是什么的时候&#xff0c;我们最先想的方法是遍历数组&#xff0c;如下&#xff1a; #include<stdio.h> #include<string.h> int main() { int arr[10]{1,2,3,4,5,6,7,8,9,10}; int key 8;//要找的数是8…

如何高效解析不定长度的协议帧

通信设计中考虑协议的灵活性&#xff0c;经常把协议设计成“不定长度”。一个实例如下图&#xff1a;锐米LoRa终端的通信协议帧。 如果一个系统接收上述“不定长度”的协议帧&#xff0c;将会有一个挑战--如何高效接收与解析。 为简化系统设计&#xff0c;我们强烈建议您采用“…

hql面试题之字符串使用split分割,并选择其中的一部分字段的问题

版本&#xff1a;20231109 1.题目&#xff1a; 有两张表,a表有id和abstringr两个字段&#xff0c;b表也有id和bstr两个字段&#xff0c;具体如下 A表&#xff1a; 1abc,bcd,cdf2123,456,789 B表: 1acddef2123456 在a表的abstring字段中用‘,’分割&#xff0c;并取出前两…

关于MySQL的66个问题

SQL基础掌握不错的小伙伴可以跳过这一部分。当然&#xff0c;可能会现场写一些SQL语句&#xff0c;SQ语句可以通过牛客、LeetCode、LintCode之类的网站来练习。 1. 什么是内连接、外连接、交叉连接、笛卡尔积呢&#xff1f; 内连接&#xff08;inner join&#xff09;&#xf…

05_MySQL主从复制架构

任务背景 ##一、真实案例 某同学刚入职公司&#xff0c;在熟悉公司业务环境的时候&#xff0c;发现他们的数据库架构是一主两从&#xff0c;但是两台从数据库和主库不同步。询问得知&#xff0c;已经好几个月不同步了&#xff0c;但是每天会全库备份主服务器上的数据到从服务…