Description

There is an old country and the king fell in love with a devil. The devil always asks the king to do some crazy things. Although the king used to be wise and beloved by his people. Now he is just like a boy in love and can’t refuse any request from the devil. Also, this devil is looking like a very cute Loli.

After the ring has been destroyed, the devil doesn't feel angry, and she is attracted by \(z*p's\) wisdom and handsomeness. So she wants to find \(z*p\) out.

But what she only knows is one part of z*p's DNA sequence S leaving on the broken ring.

Let us denote one man's DNA sequence as a string consist of letters from ACGT. The similarity of two string S and T is the maximum common subsequence of them, denote by LCS(S,T).

After some days, the devil finds that. The kingdom's people's DNA sequence is pairwise different, and each is of length m. And there are 4^m people in the kingdom.

Then the devil wants to know, for each 0 <= i <= |S|, how many people in this kingdom having DNA sequence T such that LCS(S,T) = i.

You only to tell her the result modulo 10^9+7.

Input

The first line contains an integer T, denoting the number of the test cases.

For each test case, the first line contains a string S. the second line contains an integer m.

T<=5

|S|<=15. m<= 1000.

Output

For each case, output the results for i=0,1,...,|S|, each on a single line.

Sample Input

1

GTC

10

Sample Output

1

22783

528340

497452


给你一个序列s,问长度为m的和s最长公共子序列是\([0,|s|]\)的串有多少个

思路

dp of dp

因为最长公共子序列的dp矩阵每一行相邻两项不会超过1,所以就可以用二进制状压

然后就先dp出每个状态加上一个字符的转移

然后上状压dp就可以了

注意dp数组的清零问题


#include<bits/stdc++.h>

using namespace std;

const int Mod = 1e9 + 7;
const int N = 16;
const int M = 1 << N; int trans[M][4], bitcnt[M], dp[2][M];
int len, m, ans[N], f[N], g[N];
char s[N]; int add(int a, int b) {
return (a += b) >= Mod ? a - Mod : a;
} void solve() {
scanf("%s%d", s + 1, &m);
len = strlen(s + 1);
for (int i = 1; i <= len; i++) {
if (s[i] == 'A') s[i] = 0;
if (s[i] == 'C') s[i] = 1;
if (s[i] == 'G') s[i] = 2;
if (s[i] == 'T') s[i] = 3;
}
for (int i = 0; i < (1 << len); i++) {
for (int j = 1; j <= len; j++) {
f[j] = f[j - 1] + ((i >> (j - 1)) & 1);
}
for (int j = 0; j < 4; j++) {
for (int k = 1; k <= len; k++) {
g[k] = max(g[k - 1], f[k]);
if (s[k] == j) g[k] = max(g[k], f[k - 1] + 1);
}
trans[i][j] = 0;
for (int k = 1; k <= len; k++) {
trans[i][j] |= (g[k] - g[k - 1]) << (k - 1);
}
}
}
int ind = 0;
for (int i = 0; i < (1 << len); i++) dp[ind][i] = 0; // **
dp[ind][0] = 1;
for (int i = 1; i <= m; i++) {
ind ^= 1;
for (int j = 0; j < (1 << len); j++) {
dp[ind][j] = 0;
}
for (int j = 0; j < (1 << len); j++) if (dp[ind ^ 1][j]) {
for (int k = 0; k < 4; k++) {
dp[ind][trans[j][k]] = add(dp[ind][trans[j][k]], dp[ind ^ 1][j]);
}
}
}
for (int i = 0; i <= len; i++) ans[i] = 0;
for (int i = 0; i < (1 << len); i++) {
ans[bitcnt[i]] = add(ans[bitcnt[i]], dp[ind][i]);
}
for (int i = 0; i <= len; i++) {
printf("%d\n", ans[i]);
}
} int main() {
#ifdef dream_maker
freopen("input.txt", "r", stdin);
#endif
for (int i = 0; i < M; i++) {
for (int j = 1; j <= N; j++) {
bitcnt[i] += (i >> (j - 1)) & 1;
}
}
int T; scanf("%d", &T);
while (T--) solve();
return 0;
}

BZOJ3864: Hero meet devil【dp of dp】的更多相关文章

  1. HDU 4899 Hero meet devil(状压DP)(2014 Multi-University Training Contest 4)

    Problem Description There is an old country and the king fell in love with a devil. The devil always ...

  2. bzoj千题计划241:bzoj3864: Hero meet devil

    http://www.lydsy.com/JudgeOnline/problem.php?id=3864 题意: 给你一个DNA序列,求有多少个长度为m的DNA序列和给定序列的LCS为0,1,2... ...

  3. BZOJ3864: Hero meet devil(dp套dp)

    Time Limit: 8 Sec  Memory Limit: 128 MBSubmit: 397  Solved: 206[Submit][Status][Discuss] Description ...

  4. bzoj3864: Hero meet devil

    Description There is an old country and the king fell in love with a devil. The devil always asks th ...

  5. 【BZOJ3864】Hero meet devil DP套DP

    [BZOJ3864]Hero meet devil Description There is an old country and the king fell in love with a devil ...

  6. bzoj 3864: Hero meet devil [dp套dp]

    3864: Hero meet devil 题意: 给你一个只由AGCT组成的字符串S (|S| ≤ 15),对于每个0 ≤ .. ≤ |S|,问 有多少个只由AGCT组成的长度为m(1 ≤ m ≤ ...

  7. DP套DP HDOJ 4899 Hero meet devil(国王的子民的DNA)

    题目链接 题意: 给n长度的S串,对于0<=i<=|S|,有多少个长度为m的T串,使得LCS(S,T) = i. 思路: 理解的不是很透彻,先占个坑. #include <bits/ ...

  8. bzoj 3864: Hero meet devil(dp套dp)

    题面 给你一个只由\(AGCT\)组成的字符串\(S (|S| ≤ 15)\),对于每个\(0 ≤ .. ≤ |S|\),问 有多少个只由\(AGCT\)组成的长度为\(m(1 ≤ m ≤ 1000) ...

  9. bzoj 3864: Hero meet devil

    bzoj3864次元联通们 第一次写dp of dp (:з」∠) 不能再颓废啦 考虑最长匹配序列匹配书转移 由于dp[i][j]的转移可由上一行dp[i-1][j-1],dp[i-1][j],dp[ ...

随机推荐

  1. Topless eclipse导入myeclipse的web项目没法识别问题解决

    1.进入项目目录,找到.project文件,打开. 2.找到<natures>...</natures>代码段. 3.在第2步的代码段中加入如下标签内容并保存: <nat ...

  2. angular5 组件之间监听传值变化

    http://www.cnblogs.com/SLchuck/p/5904000.html https://i.cnblogs.com/EditPosts.aspx?postid=7995179&am ...

  3. consensus sequence

    consensus sequence:称为一致序列.一些遗传元件(如启动子)中反复出现且很少有改变的DNA序列.不同种生物编码同一种蛋白质的基因也会有共有序列.通过序列比较发现相似但不一定完全相同的核 ...

  4. LeetCode--070--爬楼梯

    problem description: 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 ...

  5. 《图解Http》8: 用户身份认证Cookie管理session; 9:HTTP的追加协议(websoket, webDAV)

    基本认证,(安全等级低,多数网站不使用) Digest认证:(也不怎么用) SSL客户端认证:(凭借客户端证书认证,如网银登陆) 表单认证:用户名/密码.(常用) SSL客户端认证采用two-fact ...

  6. IE6不兼容hover已解决

    新建一个csshover.htc文件,一下是csshover.htc内容 <public:attach event="ondocumentready" onevent=&qu ...

  7. Knapsack CodeForces - 1132E (多重背包)

    可以将大量同种物品合并为$lcm$来优化, 复杂度$O(nlcm^2)$, 好像可以用bitset优化到$O(nlcm^2/\omega)$, 但是没看太懂 const int L = 840, M ...

  8. 01-trie练习

    这里用递归实现01-trie, 可以看做是区间长度为2的幂的权值线段树, 能实现权值的所有操作, 异或时, 翻转左右儿子即可. 练习1 CF 817E Choosing The Commander 大 ...

  9. 附录A——面向对象基础

    在学习设计模式之前,C#语言中一些基本的面向对象的知识还是应该具备的,比如像继承.多态,接口.抽象类,集合.泛型等. A.2 类与实例 什么是对象? 一切事物(事和物)都是对象,对象就是可以看到.感觉 ...

  10. axis2的WebService无法注入Service层类

    package com.vrv.paw.axiswebservices; import org.springframework.web.context.ContextLoader; import or ...