【NOIP2015】子串
阿新 • • 發佈:2018-10-31
演算法:
鴿鴿鴿了。。。。。
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; }