洛谷 P3804 【模板】后缀自动机 (SAM)(后缀自动机)
创始人
2024-02-14 21:32:50
0

【模板】后缀自动机 (SAM)

题目描述

给定一个只包含小写字母的字符串 SSS。

请你求出 SSS 的所有出现次数不为 111 的子串的出现次数乘上该子串长度的最大值。

输入格式

一行一个仅包含小写字母的字符串 SSS。

输出格式

一个整数,为所求答案。

样例 #1

样例输入 #1

abab

样例输出 #1

4

提示

对于 10%10 \%10% 的数据,∣S∣≤1000\lvert S \rvert \le 1000∣S∣≤1000。
对于 $100% $的数据,1≤∣S∣≤1061 \le \lvert S \rvert \le {10}^61≤∣S∣≤106。

后缀自动机, 需要维护3个数组ch[x][c]	存节点x转移边终点fa[x]		存节点x的链接边终点len[x]		存节点x的最长串的长度后缀链接树, 抽离图中的链接边
合法性: 子节点的最短串的最长后缀 = 父节点的最长串1、 节点x的子串长度: 最长 len[x], 最短 len[y] + 1 (y 是x节点的父节点)
2、 节点x的子串数量: len[x] - len[y] (y 是x节点的父节点)
3、 子串出现次数: cnt[x] (独立建立一颗后缀树,跑 dfs, 更新每个节点的cnt)后缀树 : 2n - 1 个点, 3n - 4 条边
后缀链接树: 2n 个点, 2n 条边
#include 
using namespace std;
typedef long long ll;
const int N = 2e6 + 10, M = 2e6 + 10;
char s[N];
int n;
ll cnt[N], ans;
int tot = 1, np = 1;
int fa[N], ch[N][26], len[N];int tot1;
int ver[M], Next[M], head[N];void add(int x, int y)
{ver[++tot1] = y, Next[tot1] = head[x], head[x] = tot1;
}void extend(int c)
{// p回跳指针,np 新节点// q链接点,nq 新链接点int p = np; np = ++tot;				//p指向旧节点, np是新点len[np] = len[p] + 1; cnt[np] = 1;	//子串出现次数//p沿着链接边回跳,从旧节点向新点建转移边for(; p && !ch[p][c]; p = fa[p])ch[p][c] = np;//1、 如果c是新字符, 从新点向根节点建链接边if(p == 0)fa[np] = 1;else{int q = ch[p][c];	//q是链接点//2、 若链接点合法,从新点向链接点接边if(len[q] == len[p] + 1)fa[np] = q;//3、若链接边不合法, 则裂开q点,重建两类边else{int nq = ++tot;	//nq 是新建链接点len[nq] = len[p] + 1;//重建 nq, q, np 的链接边fa[nq] = fa[q]; fa[q] = nq; fa[np] = nq;// 指向q的转移边改为指向nqfor(; p && ch[p][c] == q; p = fa[p])ch[p][c] = nq;//从q发出的转移边复制给 nqmemcpy(ch[nq], ch[q], sizeof(ch[q]));}}
}void dfs(int x)
{
//	printf("x = %d\n", x);for(int i = head[x]; i; i = Next[i]){int y = ver[i];dfs(y);cnt[x] += cnt[y];}if(cnt[x] > 1)ans = max(ans, (ll)cnt[x] * len[x]);
}int main()
{scanf("%s", s + 1);n = strlen(s + 1);for(int i = 1; i <= n; ++i){extend(s[i] - 'a');}for(int i = 2; i <= tot; ++i){add(fa[i], i);}dfs(1);printf("%lld\n", ans);return 0;
}

相关内容

热门资讯

公安部打掉黑灰产犯罪团伙200... 12月25日,公安部在京召开专题新闻发布会,通报公安部和国家金融监督管理总局联合部署开展金融领域“黑...
公安机关打掉金融领域“黑灰产”... 新华社北京12月25日电(记者任沁沁、熊丰)公安部12月25日在京召开新闻发布会,通报今年6月至11...
老年婚介服务引纠纷 成都金牛区... 追求爱情从来不是年轻人的专利,老年人也有权利去追求真爱。不过,不可只抱有美好期许,也要擦亮眼睛。近日...
国家医保局:长护险制度将从试点... 本报讯(中青报·中青网记者 刘昶荣)在日前浙江宁波召开的2025年全国长期护理保险高质量发展大会上,...
公安部发布金融领域“黑灰产”违... 12月25日,公安部在京召开专题新闻发布会,通报公安部和国家金融监督管理总局联合部署开展金融领域“黑...
国家发展改革委:加快推动交通运... 12月25日,国家发展改革委基础设施发展司刊发题为《加快构建现代化基础设施体系》的署名文章。文章指出...
国家发改委:优化收费公路政策 ... 每经AI快讯,据国家发改委官微消息,12月25日,国家发展改革委基础设施发展司发文称,深化重点领域改...
清华大学开展招生宣讲,发布招生... 红星新闻网12月25日讯12月24日,清华大学招生办公室发布声明。 声明称,近日,清华大学招生办接到...
公安部:立案查处金融领域“黑灰... 北京商报讯(记者 岳品瑜 董晗萱)12月25日,公安部召开新闻发布会,通报公安部和国家金融监督管理总...
感知山东| 胶州市开展“法律护... 为不断深化“陪伴成长”全环境立德树人品牌建设,近日,胶州市司法局李哥庄司法所联合镇宣传办,邀请市“蓝...