题目:给定两个长度分别为 N,MN,MN,M 的数组 A,BA,BA,B。
对于任意两个长度相等的数组 X,YX,YX,Y,定义函数 f(X,Y)f(X,Y)f(X,Y) 如下:
生成一个数列 CCC,使 Ci=Xi+YiC_i=X_i+Y_iCi =Xi +Yi 。如果 CCC 是回文数列,则 f(X,Y)=1f(X,Y)=1f(X,Y)=1,否则 f(X,Y)=0f(X,Y)=0f(X,Y)=0。
请你求出最大的 lll,使得存在 A,BA,BA,B 分别长度为 lll 的子数组 A′,B′A',B'A′,B′,使 f(A′,B′)=1f(A',B')=1f(A′,B′)=1。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
好的,我们遇到题先看部分分:
对于所有数据,1≤N,M≤105,1≤Ai,Bi≤1001\le N,M\le 10^5,1\le A_i,B_i\le 1001≤N,M≤105,1≤Ai ,Bi ≤100。
好的,注意到没有部分分。这启发我们直接想正解。
有一个结论:如果存在一个数 lll 符合要求,则 l−2l-2l−2 也符合这个要求。因为只需要让 A′,B′A',B'A′,B′ 删除最左边和最右边的数即可。但 l−1l-1l−1 就不一定符合要求了,比如这里有一个 hack(我才不会告诉你这是样例):
显然当 A′=[3,3,2],B′=[1,3,2]A'=[3,3,2],B'=[1,3,2]A′=[3,3,2],B′=[1,3,2] 可以使 f(A′,B′)=1f(A',B')=1f(A′,B′)=1,但不存在 l=2l=2l=2 的情况使得存在子数组满足条件。
考虑奇偶分开二分,选择长度最大值。
现在的问题是:如何以 O(n)O(n)O(n) 左右的时间复杂度是否存在判断长度为 lll 的数使得子数组满足条件?
注意到 Ai,BiA_i,B_iAi ,Bi 非常小,故考虑字符串哈希。
我们又注意到当长度为 nnn 的数组 CCC 为回文数组时,∑i=1nCi×Pi=∑i=1nCi×Pn−i****um_{i=1}^{n} C_i\times P^i=\sum_{i=1}^{n} C_i\times P^{n-i+1}∑i=1n Ci ×Pi=∑i=1n Ci ×Pn−i+1,其中 PPP 为任意正整数。所以我们可以通过这个特殊性质来判断,我们记录每个长度为 lll 的子数组的正反哈希值之差,然后 O(nlogn)O(n\log n)O(nlogn) 查找即可。时间复杂度 O(nlog2n)O(n\log^2 n)O(nlog2n)。由于
105×(log2105)2≈3×10710^5\times (\log_2 10^5)^2\approx 3\times 10^7105×(log2 105)2≈3×107,而且奇偶分开二分本身带了 222 的常数,所以就不能使用大常数的 map set 了,应该使用排序二分代替。
如果你用 set,
100→72100\rarr 72100→72
还有,不能用单模哈希,冲突概率巨大,随机生成两个 10510^5105 的数组它会说最长的 l≈9×104l\approx 9\times 10^4l≈9×104,但真正的答案在 999 左右!
时间复杂度 O(nlog2n)O(n\log^2 n)O(nlog2n)。