P2375 [NOI2014]动物园

时间:2021-10-06 21:25:18

考虑kmp。
这个题的主要问题就在于怎样使复杂度是正确的O(n)。
可以先预处理一个数组cnt[]表示不考虑不能相交这个限制,有多少个border。
这个东西其实也就是fail树上的深度。
然后考虑怎么算num,直接暴力跳到长度<=i/2为止,第一合法个位置的cnt就是答案。
这样做复杂度依然是均摊O(n)的,因为j每次最多+1。

考虑Z-box。
求出每个后缀和原串的lcp后。
枚举每一个合法后缀的左端点在什么地方。
然后这个后缀会对长度为min(i,lcp(suf))产生一个贡献,取min那一步是为了不能相交。