YZOJ P3847 [2018省队集训]Ernd

YZOJ P3847 [2018省队集训]Ernd

时间限制:1000MS      内存限制:131072KB

难度:\(8.0\)

  • 题目描述

给定一个长度为 \(n\) 且仅包含小写英文字母的字符串 \(S\)。你有一个字符串 \(T\),初始为空串。

你可以进行 \(n\) 次操作,每次操作你可以在 \(T\) 的前端或末尾加入一个任意字母。记第 \(i\) 次操作后 \(T\) 在 \(S\) 中的出现次数为 \(f_i\),你需要最大化 \(ans=\sum\limits_i f_i\) 。

  • 输入格式

第一行一个正整数 \(n\) 。

第二行一个长度为 \(n\) 的字符串 \(S\) 。

  • 输出格式

一行一个整数,表示 \(ans\) 的最大值。

  • 样例输入

  • 样例输出

  • 数据规模与约定

对于 \(100\%\) 的数据,\(1 \leq n \leq 2\times 10^5\) 。

 

 

 


 

 

 

首先肯定 \(T\) 始终为 \(S\) 的子串答案才是最优的。

考虑在 \(T\) 前/后加一个字符的操作意味着什么。

可以发现,在 SAM 上,在 \(T\) 后加一个字符意味着沿着 ch 边往下走一个节点,在 \(T\) 前加字符意味着沿着 parent 树往上跳一个节点。

所以这个关系可以表示在 \(S\) 串的 SAM 上。

由于 SAM 是一个 DAG ,连上 parent 树的边后仍然是一个 DAG ,所以可以直接 DP。

 

 

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注