AC自动机模板


const int maxn = 1000005;//定义所需要最大长度
struct Aho{struct state{int next[26];//trie树结构int fail,cnt;//失配指针和表示当前点作为结束点的标记}st[maxn];int size;//定义当前一共有多少个点queue<int>q;//层序遍历序列void init(){for(int i=0;i<maxn;i++){memset(st.next,0,sizeof(st.next));//初始化st[i].cnt=st[i].fail=0;}size=1;while(!q.empty())q.pop();}//插入函数 插入一个S串void Insert(char *s){int now=0;int len = strlen(s);for(int i=0;i<len;i++){if(!st[now].next[s[i]-'a'])st[now].next[s[i]-'a']=size++;//如果没有这个点 就新作一个点 并让size++now = st[now].next[s[i]-'a'];//如果有 那么让当前指向继续走}st[now].cnt++;//插入一个元素 当前位置下标记为一个串的结束}void build(){//构建失配指针q.push(0);//从根节点开始走 st[0].fail=-1;//根节点失配指向-1while(!q.empty()){int u = q.front();q.pop();for(int i=0;i<26;i++){if(st[u].next[i]){//如果当前点的next[i]有字符 if(u==0)st[st[u].next[i]].fail=0; //如果当前点是根 就让其孩子指向自己else{//非根int v = st[u].fail;//v存储的是当前点的失配指向while(v!=-1){//如果v非-1 表示当前点非根节点if(st[v].next[i]){//父节点的失配位置也存在当前字符 那么对于父节点的孩子 失配指针直接指向父节点失配位置的相同字符next[i]的位置 对于u的next[i]来说 u的fail结点就是最长可能的位置 st[st[u].next[i]].fail=st[v].next[i];//指向父节点的失配结点的位置 fail 处的next[i] break;//已找到 跳出 }   v = st[v].fail;//如果没有这种结点 那么继续找 从非最长公共前缀串中找 }if(v==-1)st[st[u].next[i]].fail=0;//如果此时回到了根节点 就让他直接指向0 }q.push(st[u].next[i]);  //将此点入队 层序遍历 }}} }int get(int u){int res = 0;while(u!=-1){res+=st[u].cnt;st[u].cnt=0;//在找到she串后只能算一次 算过一次后就要清0 u = st[u].fail;}}//查询s串中有多少个模板串int query(char *s){int len = strlen(s);int res=0,now = 0;//now记录当前节点的位置for(int i=0;i<len;i++){//从匹配串的第一个字符开始 向后遍历 //找到now该指向的下标  if(st[now].next[s[i]-'a'])now = st[now].next[s[i]-'a'];//如果当前位置下存在这个字符 就让now指向这里 else{//没有的话就不停找失配 int v = st[now].fail;while(v!=-1&&st[v].next[s[i]-'a']==0)v = st[v].fail;//没有到根 并且这里没有当前字符 就不停找公共前缀串 if(v==-1)now=0;//如果最后没有返回根节点 else now = st[v].next[s[i]-'a'];    //如果有 那么就让now指向那里   }if(st[now].cnt)res+=get(now); }return res;}
}aho;

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

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

相关文章

【解决问题】useBean类属性[com.cheng.pojo.People]的值无效导致HTTP500问题

先上实体类代码的前半部分&#xff1a; 这是出现问题时的&#xff1a; package com.cheng.pojo;public class People {private int id;private String name;private int age;private String address;public People(int id, String name, int age, String address) {this.id i…

python学习day32 黏包 struct模块

为什么会出现黏包问题&#xff1f; 首先只有在TCP协议中才会出现黏包现象 是因为TCP协议是面向流的协议 在发送的数据 传输过程中 有缓存机制 来避免数据丢失 因此 在连续发送小数据的时候 以及接收大小不符的时候都容易出现黏包现象 本质还是因为我们在接受数据的时候不知道发…

HDU-5935 Car 逆推 贪心 精度

题意 1 主人公从0开始开始跑 2 使用速度非递减技能 3 警察记录下了多个整数时间点他的位置 整数时间点不明确 让我们求主人公所花费的最小时间跨越过最后一个位置点 分析 本体选用逆推处理 为啥用逆推 因为速度是非递减的 如果从前面推 会导致不断重复修改 前面的时间 时间不…

[Leedcode][JAVA][第1300题][转变数组后最接近目标值的数组和][前缀和][二分法][暴力]

【问题描述】[中等] 给你一个整数数组 arr 和一个目标值 target &#xff0c;请你返回一个整数 value &#xff0c;使得将数组中所有大于 value 的值变成 value 后&#xff0c;数组的和最接近 target &#xff08;最接近表示两者之差的绝对值最小&#xff09;。如果有多种使得…

线性系统的基本理论与运算

线性系统的基本理论与运算 线性系统与非线性系统 线性系统的基本理论 二维线性移不变系统 线性移不变系统 如果一个系统既是线性系统&#xff0c;又是移不变系统&#xff0c;则该系 统是线性移不变系统。

行云管家堡垒机 导入腾讯云主机

行云管家堡垒机 导入腾讯云主机 如何实现了对多家云厂商多种云计算资源的集中管理&#xff0c;从成本、监控、备份、安全等多个维度提供统一运维管控&#xff1f; 工具/原料 行云管家堡垒机方法/步骤 Step1&#xff1a;注册登录 登录行云管家&#xff0c;支持QQ、微信、微博、G…

HDU - 5438 Ponds 拓扑 dfs

题意 在一个图中 给出了每个点得权值和连边 想要尽可能删除一些联通的点数小于2的点 删完后 求最后剩下联通块内点得数量是奇数的权值和 分析 本题由于在删除点得过程中需要考虑 当把当前点删除后 其联通的点也有可能会因为当前点得删除而连边小于2同时删除 考虑拓扑排序 建…

(总结)HTTP常见错误返回代码

&#xff08;总结&#xff09;HTTP常见错误返回代码 HTTP返回状态代码 当用户试图通过HTTP或FTP协议访问一台运行主机上的内容时&#xff0c;Web服务器返回一个表示该请求的状态的数字代码。该状态代码记录在服务器日志中&#xff0c;同时也可能在 Web 浏览器或 FTP客户端显示…

MyBatis面试题(2020最新版)

目录MyBatis简介MyBatis是什么&#xff1f;ORM是什么为什么说Mybatis是半自动ORM映射工具&#xff1f;它与全自动的区别在哪里&#xff1f;传统JDBC开发存在的问题JDBC编程有哪些不足之处&#xff0c;MyBatis是如何解决这些问题的&#xff1f;Mybatis优缺点MyBatis框架适用场景…

Java学习笔记9-2——JavaWeb

文章目录JavaBeanMVC三层架构Filter过滤器Listener监听器JDBC文件上传Servlet邮件发送ServletJavaBean 实体类 JavaBean有特定的写法&#xff1a; 必须要有一个无参构造&#xff1b;属性必须私有化&#xff1b;必须有对应的get/set方法&#xff1b; 一般用来和数据库的字段…

linux日常常用命令分析

日志处理&#xff1a;测试网络路由&#xff1a; xargs使用方法&#xff1a;tcpdump命令分析&#xff1a;dd 写入磁盘测试cpu个数&#xff1a;查看网卡流量查看端口联通情况,临时加端口ntpdate同步&#xff1a;可以取出变动的密码&#xff1a;导堆栈&#xff1a;根据进程id查看程…

离散傅立叶变换

离散傅立叶变换 一维离散傅里叶变换 二维离散傅里叶变换(2D-DFT) 、图像傅里叶变换的意义 &#xff08;1&#xff09;简化计算&#xff0c;也即傅里叶变换可将空间域中复杂的卷 积运算转化为频率域中简单的乘积运算。 &#xff08;2&#xff09;对于某些在空间域中难于处理或…

[Leedcode][JAVA][第14题][最长公共前缀][二分][横竖扫描][分治]

【问题描述】[中等] 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀&#xff0c;返回空字符串 ""。示例 1:输入: ["flower","flow","flight"] 输出: "fl" 示例 2:输入: ["dog","raceca…

【模板】在build中配置resources来防止我们资源导出失败的问题

在build中配置resources&#xff0c;来防止我们资源导出失败的问题 <!--在build中配置resources&#xff0c;来防止我们资源导出失败的问题--><build><resources><resource><directory>src/main/resources</directory><includes><…

JDBC_设计架构_驱动类加载_建立Connection_效率测试

JDBC(Java DataBase Connection) 访问数据库流程&#xff1a;驱动管理器--连接数据库--sql语句--结果集 装载mysql驱动 Class.forName("com.jdbc.mysql.Driver"); DriverManager接口是JDBC的管理器&#xff0c;作用于用户和驱动程序之间。 Demo1.java package com.qh…

HDU-4793 Collision 计算几何 解方程

题意 给我们两个大小不同的圆的半径小圆是实心的 大圆是空心的 然后给我们一个小球的半径 小球的初始位置 还有飞碟在x方向和y方向上的速度 小球撞到内实心圆会能量不损失的反弹 问小球任何位置与大圆相交到完全出去的时间是多少 分析 几何题 如何知道时间呢 如果小球与大圆…

图像傅里叶变换频谱分析

图像的傅里叶频谱特性分析 图像傅里叶频谱关于(/&#xff0c;/)的对称性 图像傅里叶频谱特性及其频谱图 傅里叶变换在图像处理中的应用

[剑指offer]面试题第[37]题[Leedcode][JAVA][第297题][二叉树列的序列化与反序列化][递归][BFS]

【问题描述】[中等] 序列化是将一个数据结构或者对象转换为连续的比特位的操作&#xff0c;进而可以将转换后的数据存储在一个文件或者内存中&#xff0c;同时也可以通过网络传输到另一个计算机环境&#xff0c;采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列…

Java学习笔记10-1——MyBatis

文章目录简介第一个Mybatis程序搭建环境导入Mybatis&#xff0c;编写配置文件编写代码测试了解一下官方文档的建议实现增删改查select、insert、update、delete使用map进行CRUD模糊查询配置解析(mybatis-config.xml)核心配置文件mybatis-config.xml环境配置&#xff08;environ…

时间

//Step1: 定义任务函数: 计算当前时间距离target时间的时间差var targetnew Date("2019/3/01 18:00:00");function calc(){//获得当前系统时间保存在变量now中var nownew Date();//用target-now&#xff0c;再除1000&#xff0c;获得秒差&#xff0c;保存在变量s中va…