1. 程式人生 > >【NOIP2015】子串

【NOIP2015】子串

題目連結

演算法:

          鴿鴿鴿了。。。。。

 

Code:

#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define mo 1000000007
using namespace std;
template<typename T> void chkmo(T &x,T y){x=(x+(y%mo))%mo;}
template<typename T> void read(T &num){
	char c=getchar();num=0;T f=1;
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+(c^48);c=getchar();}
	num*=f;
}
template<typename T> void qwq(T x){
	if(x>9)qwq(x/10);
	putchar(x%10+'0');
}
template<typename T> void write(T x){
	if(x<0){x=-x;putchar('-');}
	qwq(x);putchar('\n');
}
int A[1010];int B[210];
int dp[2][210][210][2];

int main(){
	int n,m,k;read(n);read(m);read(k);
	int temp1,temp2;temp1=temp2=0;
	char c=getchar();
	while(c<'a'||c>'z'){c=getchar();}
	while('a'<=c&&c<='z'){A[++temp1]=c-'a'+1;c=getchar();}
	while(c<'a'||c>'z'){c=getchar();}
	while('a'<=c&&c<='z'){B[++temp2]=c-'a'+1;c=getchar();}
	
	int tmp=1;
	dp[0][0][0][0]=1;
	rep(i,1,n){
		dp[tmp][0][0][0]=1;
		rep(j,1,min(i,m)){
			rep(l,1,min(j,k)){
				dp[tmp][j][l][0]=dp[tmp][j][l][1]=0;
				chkmo(dp[tmp][j][l][0],dp[1-tmp][j][l][0]+dp[1-tmp][j][l][1]);
				if(A[i]==B[j]){
					chkmo(dp[tmp][j][l][1],dp[1-tmp][j-1][l-1][0]+dp[1-tmp][j-1][l-1][1]);
					chkmo(dp[tmp][j][l][1],dp[1-tmp][j-1][l][1]);
				}
			}
		}
		tmp=1-tmp;
	}
	write((dp[1-tmp][m][k][0]+dp[1-tmp][m][k][1])%mo);
	return 0;
}