Description

Lost and AekdyCoin are friends. They always play "number game"(A boring game based on number theory) together. We all know that AekdyCoin is the man called "nuclear weapon of FZU,descendant of Jingrun", because of his talent in the
field of number theory. So Lost had never won the game. He was so ashamed and angry, but he didn't know how to improve his level of number theory. 



One noon, when Lost was lying on the bed, the Spring Brother poster on the wall(Lost is a believer of Spring Brother) said hello to him! Spring Brother said, "I'm Spring Brother, and I saw AekdyCoin shames you again and again. I can't bear my believers were
being bullied. Now, I give you a chance to rearrange your gene sequences to defeat AekdyCoin!". 



It's soooo crazy and unbelievable to rearrange the gene sequences, but Lost has no choice. He knows some genes called "number theory gene" will affect one "level of number theory". And two of the same kind of gene in different position in the gene sequences
will affect two "level of number theory", even though they overlap each other. There is nothing but revenge in his mind. So he needs you help to calculate the most "level of number theory" after rearrangement.
 

Input

There are less than 30 testcases. 

For each testcase, first line is number of "number theory gene" N(1<=N<=50). N=0 denotes the end of the input file. 

Next N lines means the "number theory gene", and the length of every "number theory gene" is no more than 10. 

The last line is Lost's gene sequences, its length is also less or equal 40. 

All genes and gene sequences are only contains capital letter ACGT. 
 

Output

For each testcase, output the case number(start with 1) and the most "level of number theory" with format like the sample output.
 

Sample Input

3
AC
CG
GT
CGAT
1
AA
AAA
0
 

Sample Output

Case 1: 3
Case 2: 2
 

题意:给你n个子串和一个母串,让你重排母串最多能得到多少个子串。

思路:如果ACGT的个数依次是num[0],num[1],num[2],num[3],将这四个数压缩成一个数,降低内存,然后动归dp[i][status]表示到自己主动机上i状态此时ACGT个数的状态时的最少

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int inf = 0x3f3f3f3f; struct Trie {
int nxt[510][4], fail[510], end[510];
int root, cnt; int newNode() {
for (int i = 0; i < 4; i++)
nxt[cnt][i] = -1;
end[cnt++] = 0;
return cnt - 1;
}
void init() {
cnt = 0;
root = newNode();
}
int getch(char ch) {
if (ch == 'A') return 0;
else if (ch == 'C') return 1;
else if (ch == 'G') return 2;
return 3;
}
void insert(char str[]) {
int len = strlen(str);
int now = root;
for (int i = 0; i < len; i++) {
if (nxt[now][getch(str[i])] == -1)
nxt[now][getch(str[i])] = newNode();
now = nxt[now][getch(str[i])];
}
end[now]++;
}
void build() {
queue<int> q;
fail[root] = root;
for (int i = 0; i < 4; i++) {
if (nxt[root][i] == -1)
nxt[root][i] = root;
else {
fail[nxt[root][i]] = root;
q.push(nxt[root][i]);
}
} while (!q.empty()) {
int now = q.front();
q.pop();
end[now] += end[fail[now]]; //好像每次都是这里
for (int i = 0; i < 4; i++) {
if (nxt[now][i] == -1)
nxt[now][i] = nxt[fail[now]][i];
else {
fail[nxt[now][i]] = nxt[fail[now]][i];
q.push(nxt[now][i]);
}
}
}
}
int dp[510][11*11*11*11+5];
int bit[4], num[4];
int solve(char str[]) {
int len = strlen(str);
memset(num, 0, sizeof(num));
for (int i = 0; i < len; i++)
num[getch(str[i])]++;
bit[0] = (num[1]+1) * (num[2]+1) * (num[3]+1);
bit[1] = (num[2]+1) * (num[3]+1);
bit[2] = (num[3]+1);
bit[3] = 1;
memset(dp, -1, sizeof(dp));
dp[root][0] = 0;
for (int A = 0; A <= num[0]; A++)
for (int B = 0; B <= num[1]; B++)
for (int C = 0; C <= num[2]; C++)
for (int D = 0; D <= num[3]; D++) {
int s = A * bit[0] + B * bit[1] + C * bit[2] + D * bit[3];
for (int i = 0; i < cnt; i++)
if (dp[i][s] >= 0) {
for (int k = 0; k < 4; k++) {
if (k == 0 && A == num[0]) continue;
if (k == 1 && B == num[1]) continue;
if (k == 2 && C == num[2]) continue;
if (k == 3 && D == num[3]) continue;
dp[nxt[i][k]][s+bit[k]] = max(dp[nxt[i][k]][s+bit[k]], dp[i][s]+end[nxt[i][k]]);
}
}
} int ans = 0;
int status = num[0] * bit[0] + num[1] * bit[1] + num[2] * bit[2] + num[3] * bit[3];
for (int i = 0; i < cnt; i++)
ans = max(ans, dp[i][status]);
return ans;
}
} ac;
char str[50]; int main() {
int n, cas = 1;
while (scanf("%d", &n) != EOF && n) {
ac.init();
for (int i = 0; i < n; i++) {
scanf("%s", str);
ac.insert(str);
} ac.build();
scanf("%s", str);
printf("Case %d: %d\n", cas++, ac.solve(str));
}
return 0;
}

HDU - 3341 Lost&#39;s revenge(AC自己主动机+DP)的更多相关文章

  1. Hdu 3341 Lost&#39;s revenge (ac+自己主动机dp+hash)

    标题效果: 举个很多种DNA弦,每个字符串值值至1.最后,一个长字符串.要安排你最后一次另一个字符串,使其没事子值和最大. IDEAS: 首先easy我们的想法是想搜索的!管她3721..直接一个字符 ...

  2. HDU - 2825 Wireless Password(AC自己主动机+DP)

    Description Liyuan lives in a old apartment. One day, he suddenly found that there was a wireless ne ...

  3. HDU - 4758 Walk Through Squares (AC自己主动机+DP)

    Description   On the beaming day of 60th anniversary of NJUST, as a military college which was Secon ...

  4. POJ 2778 DNA Sequence (AC自己主动机 + dp)

    DNA Sequence 题意:DNA的序列由ACTG四个字母组成,如今给定m个不可行的序列.问随机构成的长度为n的序列中.有多少种序列是可行的(仅仅要包括一个不可行序列便不可行).个数非常大.对10 ...

  5. hdu4758 Walk Through Squares (AC自己主动机+DP)

    Walk Through Squares Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others ...

  6. poj 3691 DNA repair(AC自己主动机+dp)

    DNA repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5877   Accepted: 2760 Descri ...

  7. hdu4057 Rescue the Rabbit(AC自己主动机+DP)

    Rescue the Rabbit Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  8. HDU - 4511 小明系列故事――女友的考验(AC自己主动机+DP)

    Description 最终放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候.女朋友告诉他.她在电影院等他,小明过来的路线必须满足给定的规则:  1.如果小明 ...

  9. Hdu 2457 DNA repair (ac自己主动机+dp)

    题目大意: 改动文本串的上的字符,使之不出现上面出现的串.问最少改动多少个. 思路分析: dp[i][j]表示如今 i 个字符改变成了字典树上的 j 节点. 然后顺着自己主动机一直转移方程. 注意合法 ...

随机推荐

  1. HTML5:标记文字

    文本层面的元素(简称文本元素).把这些元素加入文本其中,也就引入了结构和含义. HTML5规范明白指出:使用元素应该全然从元素的语义出发.但这类元素中有些元素的含义很明白,有些则比較含糊. 在元素的使 ...

  2. 20160227.CCPP体系具体解释(0037天)

    程序片段(01):01.一对一模式.c+02.中介者模式.c+03.广播模式.c 内容概要:事件 ///01.一对一模式.c #include <stdio.h> #include < ...

  3. 75.《nodejs开发指南》express4.x版-微博案例完整实现

    转自:https://blog.csdn.net/cgwcgw_/article/details/39317587 完整代码下载 https://github.com/haishangfeie/wei ...

  4. BZOJ5027: 数学题

    Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 140  Solved: 48[Submit][Status][Discuss] Description ...

  5. Python day3 知识总结

    if salary.isdigit(): salary = int(salary)判断输入的salary是否是一个整数是否成立 for index,item in enumerate(product_ ...

  6. Cannot use isset() on the result of an expression (you can use "null !== expression" instead)

    if (isset($array[2])){ 抛出错误  Cannot use isset() on the result of an expression (you can use "nu ...

  7. 图片裁剪的js有哪些(整理)

    图片裁剪的js有哪些(整理) 一.总结 一句话总结:如果用了amaze框架就去amaze框架的插件库里面找图片裁剪插件,如果没用,jcrop和cropper都不错. 1.amazeui的插件库中有很多 ...

  8. ReactJs 入门DEMO(转自别人)

    附件是分享的一些他人的ReactJs入门DEMO,以前版本使用的是JSXTransformer.js,新版的用browser.min.js替代了. DEMO 下载地址:http://files.cnb ...

  9. 1.3 Quick Start中 Step 7: Use Kafka Connect to import/export data官网剖析(博主推荐)

    不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Step 7: Use Kafka Connect to import/export ...

  10. 可重入锁ReentrantLock--转载

    突然被问到什么是可重入锁?脑袋里闪过了n中概念,最终没有找到,从网上学习一下. 原文地址:https://www.ibm.com/developerworks/cn/java/j-jtp10264/ ...