正题
题目链接:https://www.luogu.com.cn/problem/P2679
题目大意
长度为 n n n的字符串 A A A和长度为 m m m的字符串 B B B,要求从 A A A中截取 k k k个不重复的非空子串使得他们按顺序拼接起来是字符串 B B B。求方案数。
解题思路
设
f
i
,
j
,
k
,
0
/
1
f_{i,j,k,0/1}
fi,j,k,0/1表示
A
A
A到第
i
i
i个位置,
B
B
B到第
j
j
j个位置,目前截取了
k
k
k段,这个位置
i
i
i有没有被截取时的方案数。转移显然
时间复杂度
O
(
n
m
k
)
O(nmk)
O(nmk)
c o d e code code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int XJQ=1e9+7;
ll n,m,k,f[2][201][201][2];
char a[1100],b[1100];
int main()
{
scanf("%lld%lld%lld",&n,&m,&k);
scanf("%s",a+1);scanf("%s",b+1);
f[0][0][0][0]=1;
for(ll i=1;i<=n;i++){
memset(f[i&1],0,sizeof(f[i&1]));
for(ll j=0;j<=m;j++)
for(ll k=0;k<=m;k++){
if(j&&a[i]==b[j]){
if(k)(f[i&1][j][k][1]+=f[~i&1][j-1][k-1][0])%=XJQ;
if(k)(f[i&1][j][k][1]+=f[~i&1][j-1][k-1][1])%=XJQ;
(f[i&1][j][k][1]+=f[~i&1][j-1][k][1])%=XJQ;
}
(f[i&1][j][k][0]+=f[~i&1][j][k][0])%=XJQ;
(f[i&1][j][k][0]+=f[~i&1][j][k][1])%=XJQ;
}
}
printf("%lld",(f[n&1][m][k][0]+f[n&1][m][k][1])%XJQ);
}