正题
题目链接:https://www.luogu.com.cn/problem/P2679
题目大意
长度为nnn的字符串AAA和长度为mmm的字符串BBB,要求从AAA中截取kkk个不重复的非空子串使得他们按顺序拼接起来是字符串BBB。求方案数。
解题思路
设fi,j,k,0/1f_{i,j,k,0/1}fi,j,k,0/1表示AAA到第iii个位置,BBB到第jjj个位置,目前截取了kkk段,这个位置iii有没有被截取时的方案数。转移显然
时间复杂度O(nmk)O(nmk)O(nmk)
codecodecode
#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);
}