2021NC多校05-D
题意:
给出两个字符串A和B,请你从A里选一个子序列a,B里选一个子序列b,使得ab长度相同同时a<b,有多少种选法。
(length(A),length(B) leq 5000)
题解:
定义(f[i][j])为(A)到(i)为止,(B)到(j)为止的公共子序列方案数。
定义(g[i][j])为(A)到(i)为止,(B)到(j)为止,在选(A[i],B[j])的前提下,公共子序列的方案数。
那么对每个(i)和(j),有:
(f[i][j]=f[i][j-1]+f[i-1][j]-f[i-1][j-1])
如果(A[i]=B[j]),有:
(f[i][j]=f[i][j]+f[i-1][j-1]+1)
(g[i][j]=g[i-1][j-1]+1)
定义(q[i][j])为从(A[i],B[j])开始往后,在(A)和(B)内选长度相同的任意子序列的方案数。
定义(p[i][j])为当(A[i]<B[j])时,在选(A[i],B[j])的前提下往后在(A)和(B)内选长度相同的任意子序列的方案数。
定义(z[i][j])为在(i,j)之后,(p[i][j])的二维后缀和。
那么对于每个(i)和(j),有:
(q[i][j]=q[i+1][j]+q[i][j+1]-q[i+1][j+1]+q[i+1][j+1]+1)
如果(A[i]<B[j]),有:
(p[i][j]=q[i+1][j+1]+1)
(z[i][j]=p[i+1][j]+p[i][j+1]-p[i+1][j+1]+p[i][j])
可以把答案分为两类。
一类是从第一个字符开始就满足(a[0]<b[0])的,这类答案的数量显然是(z[1][1])。
一类是存在一个(k)满足(1 leq i leq k-1,a[i]=b[i]),且(a[k]<b[k])的。这类答案的数量可以这样算:
枚举(A[i])和(B[j]),在(i)和(j)之前选公告子序列,之后选满足第一个选择的位置(A[k]<B[k])的子序列,答案就是(z[i][j] imes g[i][j])
这题还有几个坑:卡内存,数组最多开两个,且不能开long long,这里需要调整一下处理顺序,反复复用两个数组。