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. linux下模拟FTP服务器(笔记)

    要在linux下做一个模仿ftp的小型服务器,后来在百度文库中找到一份算是比较完整的实现,就在原代码一些重要部分上备注自己的理解(可能有误,千万不要轻易相信). 客户端: 客户端要从服务器端中读取数据 ...

  2. spring boot 邮件发送(带附件)

    首先开启QQ邮箱的POP.SMTP服务器,获取授权码. 设置-->账户-->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 pom.xml需要加载三个ja ...

  3. C# 中的集合(Array/ArrayList/List<T>/HashTable/Dictionary)

    int [] numbers = new int[5]; // 长度为5,元素类型为 int. string[,] names = new string[5,4]; // 5*4 的二维数组 byte ...

  4. LeetCode--118--杨辉三件I

    问题描述: 给定一个非负整数 numRows,生成杨辉三角的前 numRows 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 5 输出: [ [1], [1,1], [1,2 ...

  5. 4-6 select_tag和select的区别和理解。javascript_tag

    via: :all是什么意思?主要用于约束http动作. <%= select_tag "set_locale", options_for_select(LANGUAGES, ...

  6. 在 Confluence 6 中连 Jira 的问题解决

    下面是可能会发生的一些错误信息.如果你的系统中出现了下面的一些提示,你应该调整你的日志错误级别到 WARN,然后查看具体的错误原因.请参考:Configuring Logging. error.jir ...

  7. Johnny Solving CodeForces - 1103C (构造,图论)

    大意: 无向图, 无重边自环, 每个点度数>=3, 要求完成下面任意一个任务 找一条结点数不少于n/k的简单路径 找k个简单环, 每个环结点数小于n/k, 且不为3的倍数, 且每个环有一个特殊点 ...

  8. 解决导入Gradle项目遇到的问题

    Gradle安装好了,插件也在eclipse中配置好了,却不会导入,尴尬.这里我就给大家介绍几个在配置 导入项目所遇到的问题: 分别选择Browse选中本地目录,和BuildModel创建相关的项目文 ...

  9. ajax中文乱码问题的总结

    ajax中文乱码问题的总结 2010-12-11 22:00 5268人阅读 评论(1) 收藏 举报 ajaxurljavascriptservletcallback服务器 本章解决在AJAX中常见的 ...

  10. Oracle外部表的管理和应用

    外部表作为oracle的一种表类型,虽然不能像普通库表那么应用方便,但有时在数据迁移或数据加载时,也会带来极大的方便,有时比用sql*loader加载数据来的更为方便,下面就将建立和应用外部表的命令和 ...