[HNOI2019]JOJO

[HNOI2019] JOJO

传送门

Luogu

Solution

这题真的难(.
首先考虑没有\(2\)限制的子问题:
将原串变成\((x,c)\)二元组形成的串,考虑一个前缀和一个后缀的匹配,中间的字符都要配上,然后首尾只要求字符相同.

  • 考虑如果中间有一个\((x',c)\ \ \ (x'>x)\)\(nxt\)位置造成的影响显然是直接归\(0\),因为你无论怎样无法比这个\((x',c)\)串长.

然后直接跳\(next\)就可以了,每一次增加的是一个等差数列.

如果有了\(2\)的限制,显然是可以放到树上去做.
但由于\(kmp\)的复杂度是均摊的,所以无法保证上树的复杂度.
考虑维护\(kmp\)自动机,现在你一个字符变成了\((x,c)\),可以对于每一个\(c\)把对应\(x\)\(kmp\)自动机建出来,维护需要跳到的\(next\)位置和增加的答案.
上述操作可以通过主席树维护.
可能我也讲的不是很清楚.

代码

Code

posted @ 2020-02-23 23:11  fexuile  阅读(218)  评论(0编辑  收藏  举报