一、题目
二、解法
判断子串可以理解为在 f a i l fail fail链上是否出现过。假设我们要知道 d p [ i ] dp[i] dp[i](选到 i i i的最大权值),并且我们已经知道了 d p [ 1... i − 1 ] dp[1...i-1] dp[1...i−1],我们可以把以前求出来的 d p dp dp值更新 f a i l fail fail树上的子树的权值,算 d p [ i ] dp[i] dp[i]的时候我们边匹配边获取以前标记的最大权值。
本算法需要用到dfn+线段树
,所以时间复杂度 O ( n log n ) O(n\log n) O(nlogn),贴个代码。
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int N = 20005;
const int M = 300005;
inline int read()
{
int x=0,flag=1;
char c;
while((c=getchar())<'0' || c>'9') if(c=='-') flag=-1;
while(c>='0' && c<='9') x=(x<<3)+(x