后缀自动机在复习

后缀自动机,处理所有子串。

注意:nq节点的建立,是因为新加了一个字母使原本为一个状态的东西必须分为两个状态,例如ba到baa,a的出现次数变多,a状态与ba状态分离。baa的新pnt不能是ba,因为空节点可以通过两种方式到达ba状态,它的pnt的状态就不唯一了。换句话说,ba不能由baa截断前缀得到,不符合pnt的节点的后缀与儿子相同,则跳pnt指针时会出现问题。所以建立nq节点,把是np节点pnt的状态分离出来,让nq=np的pnt。因为nq节点比ba节点短,所以ba的pnt=np的pnt=nq。

每个节点的转移他们的pnt都应该具备

题目大意

给定一个字符串,求每个长度的子串出现次数的最大值

tyvj 4123用pnt树size从大往小更新,用并查集维护是否更新过

模板代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 200020struct node{int next[26],val;int pnt;
}sam[maxn * 2];
struct node2{int sz,num;bool operator < (const node2 a) const{return sz > a.sz; }
}data[maxn * 2];
char a[maxn];
int n,tot,last,root;
int fa[maxn];
int num[maxn],ans[maxn],b[maxn];inline void add(int x){int np = ++tot,p = last;sam[np].val = sam[p].val + 1;data[np].sz = 1;while ( !sam[p].next[x] && p ) sam[p].next[x] = np, p = sam[p].pnt;int q = sam[p].next[x];if ( !q ) sam[np].pnt = root,sam[root].next[x] = np;else if ( q && sam[p].val + 1 == sam[q].val ) sam[np].pnt = q;else{int nq = ++tot;sam[nq].val = sam[p].val + 1;sam[nq].pnt = sam[q].pnt;sam[np].pnt = sam[q].pnt = nq;memcpy(sam[nq].next,sam[q].next,sizeof(sam[q].next));while ( p && sam[p].next[x] == q ) sam[p].next[x] = nq , p = sam[p].pnt;if ( sam[p].next[x] == q ) sam[p].next[x] = nq; //特判p跳到根后的情况}last = np;
}
inline void getsize(){for (int i = 0 ; i <= tot ; i++) num[sam[i].val]++;for (int i = 1 ; i <= n ; i++) num[i] += num[i - 1]; //从小到大for (int i = tot ; i >= 0 ; i--) b[--num[sam[i].val]] = i;for (int i = tot ; i >= 0 ; i--) if ( sam[b[i]].pnt != b[i] ) data[sam[b[i]].pnt].sz += data[b[i]].sz;
}
inline int getfa(int x){if ( x == fa[x] ) return x;return fa[x] = getfa(fa[x]);
}
int main(){scanf("%s",a + 1);n = (int) strlen(a + 1);for (int i = 1 ; i <= n ; i++) add(a[i] - 'a');getsize();for (int i = 1 ; i <= n + 2 ; i++) fa[i] = i;for (int i = 1 ; i <= tot ; i++) data[i].num = i;sort(data + 1,data + tot + 1);for (int i = 1 ; i <= tot ; i++){int x = data[i].num;for (int j = getfa(sam[sam[x].pnt].val + 1) ; j <= sam[x].val ; j = getfa(j + 1)){ans[j] = max(data[i].sz,ans[j]);fa[j] = fa[j + 1];}}for (int i = 1 ; i <= n ; i++) printf("%d\n",ans[i]);return 0;
}

  

 

转载于:https://www.cnblogs.com/zqq123/p/5201312.html

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

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

相关文章

1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列

1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 510 Solved: 196[Submit][Status][Discuss]Description Farmer Johns N cows (1 < N < 100,000) share many similarities. In fact, FJ has been able to narrow…

.NET点滴:SpanT

昨天小桂问了一个问题&#xff0c;把一个数组的全部元素加1&#xff0c;有什么好办法&#xff0c;于是有了下面的分析&#xff1a;var arr new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; //方法一 foreach (var i in arr) {i; } //方法二 for (var i 0; i < arr.Length; i) {…

React Native之通过DeviceEventEmitter发送和接收事件

1 怎么实现发送和接收事件 理论上封装了Android原生广播的代码,需要注册和反注册,这里用DeviceEventEmitter实现 //增加监听 DeviceEventEmitter.addListener //取消监听 //this.emitter.remove(); 这里可也可以通过安卓原生向页面js发送消息,可以参考我的这篇博客 React Nat…

navicat循环执行上下两行相减sql语句_SQL太难?你离完全理解SQL就差这10步!

- 点击上方“中国统计网”设置⭐星标不迷路&#xff01;-很多程序员视 SQL 为洪水猛兽。SQL 是一种为数不多的声明性语言&#xff0c;它的运行方式完全不同于我们所熟知的命令行语言、面向对象的程序语言、甚至是函数语言(尽管有些人认为 SQL 语言也是一种函数式语言)。我们每天…

mysql游标书写_mysql中光标如何书写

mysql中光标书写的方法&#xff1a;首先声明光标&#xff1b;然后开启光标&#xff0c;代码为【OPEN cursor_name】&#xff1b;接着捕获光标&#xff1b;最后关闭光标&#xff0c;代码为【CLOSE cursor_name】。本教程操作环境&#xff1a;windows7系统、mysql5.8版&#xff0…

9个不懂,说得好!

1.不懂珍惜&#xff0c;守着金山也不会快乐。2.不懂宽容&#xff0c;再多的朋友也会离去。3.不懂感恩&#xff0c;再优秀也难以成功。4.不懂行动&#xff0c;再聪明也难以圆梦。5.不懂合作&#xff0c;再拼搏也难以大成。6.不懂积累&#xff0c;再挣钱也难以大富。7.不懂满足&a…

useradd命令详解

功能说明&#xff1a;建立用户帐号。语  法&#xff1a;useradd [-mMnr][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-s <shell>][-u <uid>][用户帐号] 或 useradd -D [-b][-e <有…

上海女白领吃火锅碰瓷,支付宝口碑居然真的要赔?

昨天中午&#xff0c;新闻晨报在微博上发出一条新闻&#xff1a;上海一位汪小姐吃火锅的时候&#xff0c;因用支付宝口碑扫码中了一个999元大红包&#xff0c;结果因为太激动手机不小心掉进油汤里&#xff0c;捞出来以后开不了机了。关键是这位小姐觉得这是口碑和商家活动导致的…

thinkphp的select和find的区别(转)

做普通PHP项目转thinkphp时&#xff0c;字段自动完整匹配&#xff0c;ajax时前台数据一直取不到&#xff0c;后发现是select和find返回数据集有差异&#xff0c;参考下面方法修改。 $this->ajaxReturn($msg[0]); select返回的是二维数组&#xff0c;find返回一维数组。 thin…

ASP.NETCore统一处理404错误都有哪些方式?

当未找到网页并且应用程序返回 404 错误时&#xff0c;ASP.NET Core MVC 仅呈现通用浏览器错误页面&#xff0c;如下图所示这不是很优雅&#xff0c;是吗&#xff1f;我们平时看到的404页面一般是这样的还有这样的试了下京东&#xff0c;地址不存在的时候是会重定向到首页下面就…

React Native之组件(Component)生命周期学习笔记

1、Component介绍 一般Component需要被其它类进行继承&#xff0c;Component和Android一样&#xff0c;也有生命周期 英文图片如下 2 具体说明 1)、挂载阶段 constructor() //构造函数,声明之前先调用super(props) componentWillMount()//因为它发生在render()方法前&…

基于junit4的关于个人所得税计算的等价类与边界值_《边界值分析》-有这篇就够了...

目录&#xff1a;定义&#xff08;What&#xff09;为什么使用该方法&#xff1f;&#xff08;Why&#xff09;如何选定边界值&#xff1f;&#xff08;How&#xff09;设计测试用例根据测试用例的完整性划分边界的分类使用场景实战演练边界值分析的优缺点特殊值测试边界值分析…

【Envi风暴】ENVI中求两幅遥感影像的相关性(相关系数)

相关性,是指两个变量的关联程度。一般地,从散点图上可以观察到两个变量有以下三种关系之一:两变量正相关、负相关、不相关。如果一个变量高的值对应于另一个变量高的值,相似地,低的值对应低的值,那么这两个变量正相关。在土壤中,孔隙率和渗透度就具有典型的正相关。反之…

win 7 旗舰版镜像 注入USB3.0 驱动

问题来源&#xff1a;原版的win7镜像没有集成USB3.0的驱动&#xff0c;然后如今的电脑主板基本是XHCI主控&#xff08;以前是EHCI的&#xff09;&#xff0c;这一变动导致在安装Win7的过程中会出现USB接口全部失灵的状况&#xff0c;所以在安装时无法识别USB3.0接口的键盘鼠标和…

(三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录

. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE)…

Git之pull后回退版本

1 问题 更新代码 git pull 然后我想回退上一个版本 2 解决办法 1) 查看历史记录 git reflog git reflog 8b0f68e HEAD{0}: pull: Fast-forward 1b2c852 HEAD{1}: reset: moving to HEAD{1} d6cf47e HEAD{2}: pull: Fast-forward 1b2c852 HEAD{3}: pull: Fast-forward2)…

C# StreamReader类和StreamWriter类

先看看 StreamReader&#xff0c;将前面的示例转换为读取文件以使用 StreamReader。它现在看起来容易得多。StreamReader 的构造函数接收FileStream。使用 EndOfStream 属性可以检查文件的末尾&#xff0c;使用ReadLine 方法读取文本行&#xff1a;public static void ReadFile…

DIV+CSS列表式布局(同意图片的应用)

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">2 <html xmlns"http://www.w3.org/1999/xhtml">3 <head>4 <!--gbk,gb2312 中文-->5 &…

斯皮尔曼等级相关

一、斯皮尔曼等级相关简介 斯皮尔曼等级相关(Spearman’s correlation coefficient for ranked data)主要用于解决称名数据和顺序数据相关的问题。适用于两列变量,而且具有等级变量性质具有线性关系的资料。由英国心理学家、统计学家斯皮尔曼根据积差相关的概念推到而来,一…

怎么在mysql中打开表存信息,我应该如何存储用户的“收藏夹”在mySQL表?

I keep reading that I should store this in a separate table "with one value per line". What does this mean exactly? Like this - So that each "favoriting" gets another user entry?USER_ID SKU_Favorited001 10016001 10067024 10016001 1001…