牛客多校第五场D Double Strings
牛客多校第五场D Double Strings
题意: 给定两个字符串A,B求长度相同的AB子串,使得子串的前面部分相等,且第一个不相等的位置B>A。求这样的子串个数
场上把两个DP写反了,应该先求前面部分相等的种数,再对于后半部分的大于DP
思路:f[i][j]表示A的前i个字符与B的前j个字符能组成多少相等的子串。
若AB不相等,f[i][j]=f[i--1][j]+f[i][j-1]-f[i-1][j-1];
若AB相等,f[i][j]额外加上f[i-1][j-1],表示一定带有当前这两个字符的相等子串
求完f之后再利用f求解
dp[i][j]表示A前i个字符与B前j个字符的解数。
dp[i][j]=dp[i-1][j]+dp[i][j-1] (原来一直觉得这里要减掉一个dp[i-1][j-1]后来问了别人才知道因为这里如果前面i-1,j-1的子串是符合条件的,那么这里i与j无论放什么都没有关系,所以还要加回去,就正好抵消了)
如果b[j]>a[i] dp[i][j]额外加上f[i-1][j-1]
下附代码:
View Code