SAM PAM 算法模板

news/2024/10/21 19:50:25/

最近发现我字符串很菜(你这话不对,你不是上个学期就已经是整个机房字符串最菜的吗)。我好像经常忘板子(其实写这篇的时候我已经忘了SA怎么写了)。所以写篇博客吧,若以后再忘可以帮助记忆。

SAM和PAM这两个自动机长得比较像,可以一起记。

这里目前只有基础的版本,只能处理单串问题。广义的版本以后某时再补上(发出咕咕的声音)。

SAM 后缀自动机

如何背板:
记住一个循环:for (; p && !go[p][c]; p = par[p]) go[p][c] = np;
记住一个条件:len[q] == len[p] + 1
记得设根为1,不能用空结点做根

伪代码

设0为空结点,1为根
extend(c) {新建 np 并设置 len (其实是设置除par外的所有属性,因为go为空)for (!go[p][c]) go[p][c] = np;if (!p) par = 1;else {par[p] 本应是 q = go[p][c],但必须 len[q] = len[p] + 1if (len[q] == len[p] + 1) par[p] = q;else {新建 nq: 除 len = len[p] + 1 外都与q一样for (go[p][c] == q) go[p][c] = nq;par[np] = par[q] = nq;}}p = np;
}

代码

int go[N][26], par[N], len[N], cnt = 1, p = 1;
void extend(int c) {int np = ++cnt;len[np] = len[p] + 1;for (; p && !go[p][c]; p = par[p]) go[p][c] = np;if (!p) par[np] = 1;else {int q = go[p][c];if (len[q] == len[p] + 1) par[np] = q;else {int nq = ++cnt;len[nq] = len[p] + 1;par[nq] = par[q];memcpy(go[nq], go[q], sizeof *go);for (; p && go[p][c] == q; p = par[p]) go[p][c] = nq;par[np] = par[q] = nq;  //be aware}}p = np;
}

PAM 回文自动机

如何背板:
记住一个循环:while (s[i-len[p]-1] ^ s[i]) p = fail[p];
记得0根为0号,-1根为1号。这样可以使其余结点的fail自动指向0

go[p][c]为空时新建结点,注意一定要把go[p][c] = np留到最后来设置
否则会导致第一个加入的结点fail指向自己。现象是在插入第二个字符时死循环。
如果模板写挂了,调试最好先输出每次新建结点的faillen,用aaaaabacaba可以排除大部分错。

int go[N][26], fail[N], len[N], np = 1, p = 0;
void init() {len[1] = -1; fail[0] = fail[1] = 1;}
void extend(int i, int c) {while (s[i-len[p]-1] ^ s[i]) p = fail[p];int &ch = go[p][c];if (!ch) {len[++np] = len[p] + 2;do p = fail[p];while (s[i-len[p]-1] ^ s[i]);fail[np] = go[p][c];ch = np;    //be aware}p = ch;
}

http://www.ppmy.cn/news/345137.html

相关文章

PAM(4)

有了前面的知识,今天将和大家一起写一个简单的PAM模块 好了废话不说了直接写吧(文件为 pam_test.c) [cpp] view plain copy #define PAM_SM_AUTH #include <security/pam_modules.h> #include <security/pam_appl.h> #include <stdio.h> #include &…

PAM(一)

学着写PAM 模块之前了解下PAM的大致情况是不错的选择(也是必须的),所以这里也只好引用一下关于PAM简介的内容了 原文地址&#xff1a;http://blog.csdn.net/yyyyangyang/article/details/6589086 一、什么是PAM PAM(Pluggable Authentication Modules)可插拔认证模块,最初是有S…

McPAT

McPAT: An Integrated Power, Area, and Timing Modeling Framework for Multicore and Manycore Architectures 论文的参与单位&#xff1a;美国圣母大学&#xff0c;惠普实验室&#xff0c;国立首尔大学&#xff0c;圣迭戈加利福尼亚大学 摘要&#xff1a; McPAT&#xff1a…

使用 Terraform 在 GCP 上一键部署 EMQX MQTT Broker

引言 MQTT 是一种轻量级的消息传递协议&#xff0c;适用于物联网应用实现设备间通信。 作为一款主流的开源 MQTT Broker&#xff0c;EMQX 能够提供高扩展性、可靠性和安全性的 MQTT 消息传递服务。 借助广泛应用的基础设施即代码&#xff08;IaC&#xff09;工具 Terraform&a…

PA

About the manual 数据包加速器&#xff08;PA&#xff09;是网络协处理器&#xff08;NETCP&#xff09;外设的主要组件之一。该PA与安全加速器&#xff08;SA&#xff09;和千兆位以太网交换机子系统一起形成网络处理解决方案。NETCP中PA的目的是执行数据包处理操作&#xff…

Linux中pam模块详解

pam简介 Linux-PAM(linux可插入认证模块)是一套共享库&#xff0c;使本地系统管理员可以随意选择程序的认证方式。换句话说&#xff0c;不用重新编译一个包含PAM功能的应用程序&#xff0c;就可以改变它使用的认证机制。这种方式下,就算升级本地认证机制,也不用修改程序. PAM使…

PAM(3)

写到这一篇才发现自己了解的远没有预期的多.. 上一次说了对话函数,对话函数是PAM模块与使用PAM进行认证的应用程序进行信息交互的桥梁,通过对话函数PAM模块可以获得用户的输入信息(明文、密文)&#xff0c; 还有两套很重要的函数 pam_set_data(pam_handle_t *pamh, const char …

podman简介

podman简介掌握docker,跟上云时代的步伐 Podman是一个开源项目&#xff0c;可在大多数Linux平台上使用并开源在GitHub上。Podman是一个无守护进程的容器引擎&#xff0c;用于在Linux系统上开发&#xff0c;管理和运行Open Container Initiative&#xff08;OCI&#xff09;容器…