1
题意简述
(A,B)构成的一个长为(T)序列,给定(M,N)表示每次将恰好(A)个(M)与(B)个(N)变为(Z),且每次操作所改变的(A,B)之间不能有(Z),求将所有字母改变为(Z)的方案与否。
题解
首先特判(M=0,N=0)。
结论:当且仅当(kM)个(A)与(kN)个(B)时有合法方案,其余情况无合法方案。
证明
(k=1)时显然。(即一次性可改变所有字母)
(k>1)时,将整个序列划分为每段长(K),共(s)段的子序列,其中(K=M+N,Ks=T)
从([1,K],[K+1,2K],...)中,至少有一个子序列(alpha)含(leq M)个(A),至少有一个子序列(eta)含(geq M)个(A)
在长度(K)的“窗口”从第1位开始向右移动时,总会从序列(alpha)移动到序列(eta),且每次移动时区间内的(A)的数量(D)只可能(+1,-1,0)三种变化情况。(*)
所以在这之间的某一个区间一定满足(D=M),且该区间连续,可以把他删除。以此递归,可证。
(*)设区间(A[BBAB]A),窗口向右滑动时,多(1)个(A)少(1)个(B),(A)的数量变化是(+1);设区间(A[ABAB]A),窗口向右滑动时,多(1)个(A)少(1)个(A),(A)的数量变化是(0),同理区间(A[BABB]B);设区间(A[ABAB]B),窗口向右滑动时,多(1)个(B)少(1)个(A),(A)的数量变化是(-1)。
用栈维护从(1)到第(J)位(A)的个数(sum[J]),如果某段区间有恰好(M)个(A)(即(sum[top]-sum[top-N-M]=N)),则该区间合法。倒序输出。