存个模板

void get_SAM(int w)
{//加入的字母-'a' //c[w]域是一个DAG 存的是转移边 也就是后缀自动机 而par域是存辅助建后缀自动机的parent树 int x=++ndnum,tmp=lasts;nd[x].len=nd[lasts].len+1;//一直向下跳 直到在parent树上找到第一个包含x转移边的right集合 for(;tmp&&!nd[tmp].c[w];tmp=nd[tmp].par) nd[tmp].c[w]=x;//将A以上的边连向x if(!tmp) nd[x].par=root;//如果不存在 x就直接连root else{//tmp相当于A int B=nd[tmp].c[w];//把转移后的集合记为B if(nd[B].len==nd[tmp].len+1) nd[x].par=B;//如果满足是一起分裂的 就将x合并入B else{//否则新建一个点 将两边连向这个点 int nB=++ndnum;nd[nB]=nd[B];//nB的所有边转移信息来自B nd[B].par=nd[x].par=nB;//连向新建的点 nd[nB].len=nd[tmp].len+1;//分裂极限是约束较大的A的len+1 // 往回走 将所有转移边原本连向B的指向nB 以后找x就可以通过nB来找for(;tmp&&nd[tmp].c[w]==B;tmp=nd[tmp].par) nd[tmp].c[w]=nB;}}lasts=x;
}

一道例题:后缀自动机求最小表示法

思路:利用性质:后缀自动机可以表示出一个串的所有子串。先把原串复制一遍,每次贪心地走最小的一个字符,如果没有,再向后for,一直走满len个

注意:len存的是后缀的长度,所以最终答案应该是nd[now].len-len+1 (要求的是最小表示的起始位置)

//#include<bits/stdc++.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
#define N 10005
struct node{int c[27],len,par;
}nd[N*4];
char s[N*2];
int root=1,ndnum=1,lasts=1;//1!!
void add(int w)
{//加入的字母-'a' //c[w]域是一个DAG 存的是转移边 也就是后缀自动机 而par域是存辅助建后缀自动机的parent树 int x=++ndnum,tmp=lasts;nd[x].len=nd[lasts].len+1;//一直向下跳 直到在parent树上找到第一个包含x转移边的right集合 for(;tmp&&!nd[tmp].c[w];tmp=nd[tmp].par) nd[tmp].c[w]=x;//将A以上的边连向x if(!tmp) nd[x].par=root;//如果不存在 x就直接连root else{//tmp相当于A int B=nd[tmp].c[w];//把转移后的集合记为B if(nd[B].len==nd[tmp].len+1) nd[x].par=B;//如果满足是一起分裂的 就将x合并入B else{//否则新建一个点 将两边连向这个点 int nB=++ndnum;nd[nB]=nd[B];//nB的所有边转移信息来自B nd[B].par=nd[x].par=nB;//连向新建的点 nd[nB].len=nd[tmp].len+1;//分裂极限是约束较大的A的len+1 // 往回走 将所有转移边原本连向B的指向nB 以后找x就可以通过nB来找for(;tmp&&nd[tmp].c[w]==B;tmp=nd[tmp].par) nd[tmp].c[w]=nB;}}lasts=x;
}
int main()
{int T;scanf("%d",&T);while(T--){memset(nd,0,sizeof(nd));ndnum=1,lasts=1;scanf("%s",s);int len=strlen(s);for(int i=0;i<len;i++)add(s[i]-'a');for(int i=0;i<len;i++)add(s[i]-'a');int now=1;for(int i=1;i<=len;i++)for(int j=0;j<26;j++)if(nd[now].c[j]){now=nd[now].c[j]; break;}printf("%d\n",nd[now].len-len+1);}
}

转载于:https://www.cnblogs.com/mowanying/p/11197462.html

后缀自动机(模板+例题)相关推荐

  1. 不在B中的A的子串数量 HDU - 4416 (后缀自动机模板题目)

    题目: 给定一个字符串a,又给定一系列b字符串,求字符串a的子串不在b中出现的个数. 题解: 先将所有的查询串放入后缀自动机(每次将sam.last=1)(算出所有子串个数) 然后将母串放入后缀自动机 ...

  2. 后缀自动机(SAM)构造实现过程演示+习题集锦

    文章目录 后缀自动机 算法实现过程 模板 习题 洛谷后缀自动机模板题 品酒大会 [HEOI2015]最短不公共子串 字符串 蒟蒻写这篇blogblogblog主要是存一下,后缀自动机的详细搭建过程,方 ...

  3. 后缀自动机(探索)Codeforces 427D

    想学后缀自动机的 弱鸡 表示真自闭啊 开局一道题,内容全靠水 :Codeforces 427D 有题目才能更好地学 算法 题意很简单 :给两个字符串,求最短公共子串 的长度 后缀自动机 模板很多 ,给 ...

  4. 后缀自动机(SAM)讲解 + Luogu p3804【模板】后缀自动机 (SAM)

    本文求节点子串长度最小值有点问题,现已修改. SAM 后缀自动机可以存储某一个字符串的所有子串. 一.概念 下图是一个 字符串 "aababa" 的 后缀自动机. 上图中的 黑色边 ...

  5. 后缀自动机 ---- P3804 【模板】后缀自动机(求每个等价类最长串的出现次数)

    后缀自动机一些关键点 首先后缀自动机上面每个节点都是一个等价类并且是最长的字符串的结尾 后缀自动机上的fail链反建就是parent tree,下面是SAM和Parent tree的构造 对于这道模板 ...

  6. 模板:后缀自动机(SAM)

    所谓后缀自动机,就是通过后缀建立的自动机 (逃) 请允许我先介绍一下后缀家族: (又逃) 前言 OI生涯目前为止学习的最为难以理解的算法,没有之一. 到现在也没有完全的理解. qwq 概念 定义: 后 ...

  7. [学习笔记]后缀自动机

    解决大部分字符串问题的大杀器 给一下clj课件:戳我 SAM是一个博大精深的算法.虽然没有像网络流家族,Tarjan家族一样拉帮结派,但是自身包含很多方法. 一.前言 字符串常见问题:各种匹配 1.L ...

  8. JZOJ4025. 【佛山市选2015】找回密码(后缀自动机SAM)

    题目描述 Description Kevin是一个热爱字符串的小孩.有一天,他把自己的微信登录密码给忘记了,万般无奈之下只好点"找回密码". 这时候,网页上出现了当初设定的密保问题 ...

  9. 【算法竞赛学习笔记】后缀自动机SAM-超经典的字符串问题详解

    title : 后缀自动机 date : 2021-11-11 tags : ACM,字符串 author : Linno 前置知识 KMP,Trie,AC自动机等字符串基础 DFA(有限状态自动机) ...

最新文章

  1. linux 源码安装e1000e,linux安装网卡e1000e
  2. 2021年春季学期-信号与系统-第三次作业参考答案-第一道题
  3. 超级计算机排名表格,全球超级计算机500强_科技时代首页_新浪网
  4. 高并发架构系列:如何从0到1设计一个MQ消息队列
  5. 非此即彼的逻辑错误_MBA逻辑攻略逻辑知识大全,快来收藏吧!
  6. kubernetes-dashboard(1.8.3)部署与踩坑
  7. rgb fusion检测不到显卡_【论文阅读27】Co-Fusion
  8. 图像傅里叶变换频谱分析
  9. 版权归原作者的飞鸽传书(IPMSG)
  10. 图像数据转换成db(leveldb/lmdb)文件(转)
  11. 面试中对hashMap的再次理解,负载因子为什么为0.75
  12. 什么作用计算机辅助工艺,什么是CAPP技术(计算机辅助工艺过程设计)
  13. jquery开发的”天才笨笨碰“游戏
  14. python实现前向匹配中查找最大长度的最高重复模式的子字符串
  15. java学生课程设计报告_学生信息管理系统java课程设计报告
  16. 【SmartDental】小组第一次会议纪要
  17. Androidstudio setting .DEX extension only for .CLASS files
  18. 【北亚数据恢复】DELL EqualLogic PS6100服务器raid5磁盘阵列中硬盘出现坏道离线的数据恢复
  19. 争对让望对思野葛对山栀注解_《笠翁对韵》注音注释(四支)
  20. python海贼王_Python 学习笔记---爬取海贼王动漫

热门文章

  1. 实验室设备测量超低偏置电流的实用技巧
  2. 常用地图投影转换公式
  3. 关于计算机运行管理模式,浅谈学校计算机机房管理及维护运行模式.docx
  4. php教育网站设计案例_课程教学网站的设计与实现(MySQL)(含录像)
  5. 外卖店优先级(模拟)
  6. 多台网络分析仪自动化测试软件NSAT-1000
  7. 近期量子计算论文总结
  8. Unity中国象棋(二)——走棋
  9. 在线公网安备案保姆级教程【伸手党福利】
  10. 霍兰德人格分析雷达图