2017.09.09【NOIP提高组】模拟赛B组

来源:互联网 发布:死而有知 编辑:程序博客网 时间:2024/06/05 16:19

T3:首先我们考虑一下,当存在一个a[i]=b[j]时,那么A中的第i个位置与B中的第j个位置对齐时,他们就对答案有贡献。举一个例子:

*A*

**A

(*为未知)

那么我们看到那两个A,首先把他们对齐:

  *A*

**A

那么这一对的答案就是2*1=2。其中第一个因数的意义就是从A最多可以往前的公共部分的长度为2,第二个因数的意义是从A往后公共部分的长度为1。通过这个我们可以发现对于a[i]=b[j]对答案的贡献就是min(i,j)*min(n-i+1,n-j+1)。这是n^2的方法,能拿60分。

现在我们考虑对于每个i,与a[i]相同的有b[j1],b[j2]...b[jk],那么对于所有j有一些在i的前面,有一些在i的后面。

对于在i前面的j,min(n-i+1,n-j+1)=n-i+1,所以我们可以对(j1+j2...)维护前缀和来计算。

对于在i后面的j,min(i,j)=i,所以我们可以对(n-j1+1+n-j2+1...)维护后缀和来计算。

这样的时间复杂度是O(n)的。