[HNOI2019] JOJO
传送门
Solution
这题真的难(.
首先考虑没有(2)限制的子问题:
将原串变成((x,c))二元组形成的串,考虑一个前缀和一个后缀的匹配,中间的字符都要配上,然后首尾只要求字符相同.
- 考虑如果中间有一个((x',c) (x'>x))对(nxt)位置造成的影响显然是直接归(0),因为你无论怎样无法比这个((x',c))串长.
然后直接跳(next)就可以了,每一次增加的是一个等差数列.
如果有了(2)的限制,显然是可以放到树上去做.
但由于(kmp)的复杂度是均摊的,所以无法保证上树的复杂度.
考虑维护(kmp)自动机,现在你一个字符变成了((x,c)),可以对于每一个(c)把对应(x)的(kmp)自动机建出来,维护需要跳到的(next)位置和增加的答案.
上述操作可以通过主席树维护.
可能我也讲的不是很清楚.