Cheat
首先建出sam。
答案显然具有单调性,考虑二分答案,可以通过dp来check。
令(f_{i})表示当前匹配到第i个字符,最大能够匹配的字符数。
设二分的值为(k),一个显然的暴力是(f_{i}=max(f_{j}+i-j+1)),(j)到(i)能够匹配,(i>=j-k)。匹配的过程可以在广义后缀自动机上实现。
但是这个过程复杂度过高,考虑优化。首先可以发现对于某个位置,向前能够匹配的长度是一定的,可以预处理出来,在后缀自动机上跑,失配跳fa即可实现(O(n))预处理。
再看,这个dp的转移过程具有单调性,因此可以用单调队列优化。
(O(len*loglen))
你的名字
首先考虑68分暴力,对询问串建出sam,能够预处理出来每个位置能够贡献的本质不同子串数。将询问串放在(S)的sam上跑,能够处理出来每个位置匹配的最长长度,那么这个位置对于答案的贡献就是(len_{x}-max(len_{fa},len_{匹配}))。
对于任意位置的询问,与上面的区别是,匹配的过程变得无法继续了。可以用可持久化线段树合并预处理出每个sam上每个点的endpos集合,匹配过程中只要判断当前节点是否存在特定区间的endpos就可以继续完成匹配。
需要注意的是,在匹配的过程中,不能一旦失配就立刻跳fa,因为当前匹配长度可能不存在合法的endpos,然而当前节点的另一长度可能合法,因此需要先(len--),直到长度达到父亲节点的(len)才能跳。匹配仍然是线性的。
DZY Loves Math
化一化式子,发现最后只需要求这个东西:
暴力求似乎(?)过不了,所以我们考虑线筛。
首先只有(mu(x))只有不含平方因子的时候不为0,所以(f(i)=f(x))或(f(i)=f(x)-1)
考虑分情况讨论:
$$egin{aligned}
g(x)&=sumlimits_{i|x}f(i)mu(frac{x}{i})
&=f(x)sumlimits_{i|x且f(i)=f(x)}mu(frac{x}{i})+(f(x)-1)sumlimits_{i|x且f(i)f(x)-1}mu(frac{x}{i})
&=f(x)sumlimits_{i|x}mu(frac{x}{i})-sumlimits_{i|x且f(i)f(x)-1}mu(frac{x}{i})
end{aligned}
于是可以递归求解。