bzoj 3864

dp of dp
我就是来贴个代码

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a),i##_end=(b);i<=i##_end;++i)
#define For(i,a,b) for(int i=(a),i##_end=(b);i<i##_end;++i)
#define per(i,a,b) for(int i=(b),i##_st=(a);i>=i##_st;--i)
#define foe(i,a) for(__typeof(a.begin()) i=a.begin();i!=a.end();++i)
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define Es(x,i) for(Edge *i=G[x];i;i=i->nxt)
#define debug(...) fprintf(stderr, __VA_ARGS__)
typedef double db;
typedef long long ll;
typedef vector<int> Vi;
typedef pair<int,int> pii;
const int inf=~0u>>1,mo=1e9+7;
inline int rd(){
    int x,c,f=1;while(!isdigit(c=getchar()))f=c!='-';x=c-'0';
    while(isdigit(c=getchar()))x=x*10+c-'0';return f?x:-x;
}
const char t[]="ATCG";
const int MXN=1<<15,MXM=1011;
char s[18];
int to[MXN+2][4],f[MXN+2],g[MXN+2],ans[18];
int main(){
    int T=rd();
    while(T--){
        scanf("%s",s+1);
        int n=strlen(s+1),m=rd();
        rep(i,1,n)For(j,0,4)if(s[i]==t[j]){s[i]=j;break;}
        For(i,0,1<<n){
            For(j,0,4){
                int tw=0,u=0,v=0;
                rep(k,1,n){
                    int nv=v+(i>>k-1&1),nu=max(u,nv);
                    if(s[k]==j)nu=max(nu,v+1);
                    if(nu>u)tw|=1<<k-1;
                    u=nu,v=nv;
                }
                to[i][j]=tw;
            }
        }
        memset(f,0,sizeof f);
        f[0]=1;
        rep(i,1,m){
            memset(g,0,sizeof g);
            For(j,0,1<<n)
                For(k,0,4)(g[to[j][k]]+=f[j])%=mo;
            memcpy(f,g,sizeof f);
        }
        memset(ans,0,sizeof ans);
        For(i,0,1<<n)(ans[__builtin_popcount(i)]+=f[i])%=mo;
        rep(i,0,n)printf("%d\n",ans[i]);
    }
}

猜你喜欢

转载自www.cnblogs.com/limfc/p/9054928.html