HDU 3341 Lost's revenge
Lost's revenge
This problem will be judged on HDU. Original ID: 3341
64-bit integer IO format: %I64d Java class name: Main
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
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
Sample Input
3
AC
CG
GT
CGAT
1
AA
AAA
0
Sample Output
Case 1: 3
Case 2: 2
Source
#include <bits/stdc++.h>
using namespace std;
const int maxn = ;
struct Trie {
int ch[maxn][],fail[maxn],cnt[maxn],tot;
int id[];
void init() {
tot = ;
newnode();
for(int i = ; i < ; ++i) id["ACGT"[i]] = i;
}
int newnode() {
memset(ch[tot],,sizeof ch[tot]);
fail[tot] = cnt[tot] = ;
return tot++;
}
void insert(char *str,int rt = ) {
for(int i = ; str[i]; ++i) {
int &x = ch[rt][id[str[i]]];
if(!x) x = newnode();
rt = x;
}
cnt[rt]++;
}
void build(int rt = ) {
queue<int>q;
for(int i = ; i < ; ++i)
if(ch[rt][i]) q.push(ch[rt][i]);
while(!q.empty()) {
rt = q.front();
q.pop();
cnt[rt] += cnt[fail[rt]];
for(int i = ; i < ; ++i) {
int &x = ch[rt][i],y = ch[fail[rt]][i];
if(x) {
fail[x] = y;
q.push(x);
} else x = y;
}
}
}
int dp[maxn][*** + ];
int solve(char *str) {
int bt[] = {,,,},num[] = {};
for(int i = ; str[i]; ++i) ++num[id[str[i]]];
for(int i = ; i >= ; --i)
bt[i] = bt[i + ]*(num[i] + );
memset(dp,-,sizeof dp);
int ans = dp[][] = ;
for(int a = ; a <= num[]; ++a)
for(int b = ; b <= num[]; ++b)
for(int c = ; c <= num[]; ++c)
for(int d = ; d <= num[]; ++d) {
int hs = a*bt[] + b*bt[] + c*bt[] + d;
for(int i = ; i < tot; ++i) {
if(dp[i][hs] == -) continue;
for(int k = ; k < ; ++k) {
if(a == num[] && k == ) continue;
if(b == num[] && k == ) continue;
if(c == num[] && k == ) continue;
if(d == num[] && k == ) continue;
int x = dp[ch[i][k]][hs + bt[k]];
int y = dp[i][hs] + cnt[ch[i][k]];
dp[ch[i][k]][hs + bt[k]] = max(x,y);
}
}
}
int st = num[]*bt[] + num[]*bt[] + num[]*bt[] + num[]*bt[];
for(int i = ; i < tot; ++i)
ans = max(ans,dp[i][st]);
return ans;
}
} ac;
char str[maxn];
int main() {
int n,cs = ;
while(scanf("%d",&n),n){
ac.init();
while(n--){
scanf("%s",str);
ac.insert(str);
}
scanf("%s",str);
ac.build();
printf("Case %d: %d\n",cs++,ac.solve(str));
}
return ;
}
HDU 3341 Lost's revenge的更多相关文章
- HDU 3341 Lost's revenge AC自动机+dp
Lost's revenge Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)T ...
- HDU 3341 Lost's revenge(AC自动机+DP)
Lost's revenge Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)T ...
- HDU 3341 Lost's revenge ( Trie图 && 状压DP && 数量限制类型 )
题意 : 给出 n 个模式串,最后给出一个主串,问你主串打乱重组的情况下,最多能够包含多少个模式串. 分析 : 如果你做过类似 Trie图 || AC自动机 + DP 类似的题目的话,那么这道题相对之 ...
- HDU 3341 Lost's revenge (AC自动机 + DP + 变进制/hash)题解
题意:给你些分数串,给你一个主串,主串每出现一个分数串加一分,要你重新排列主串,最多几分 思路:显然这里开$40^4$去状压内存不够.但是我们自己想想会发现根本不用开那么大,因为很多状态是废状压,不是 ...
- HDU - 3341 Lost's revenge(AC自己主动机+DP)
Description Lost and AekdyCoin are friends. They always play "number game"(A boring game b ...
- Lost's revenge - HDU 3341 (自动机+DP)
题目大意:先给你一些子串,然后给你一个母串,母串里面的字母可以任意调换位置,问最多这个母串经过一些位置变动最多能包含多少个子串. 分析:可以比较明显的看出来的DP,先求出来ATGC分别有多少,然后 ...
- Hdu 3341 Lost's revenge (ac+自己主动机dp+hash)
标题效果: 举个很多种DNA弦,每个字符串值值至1.最后,一个长字符串.要安排你最后一次另一个字符串,使其没事子值和最大. IDEAS: 首先easy我们的想法是想搜索的!管她3721..直接一个字符 ...
- Lost's revenge HDU - 3341 AC自动机+DP(需要学会如何优雅的压缩状态)
题意: 给你n个子串和一个母串,让你重排母串最多能得到多少个子串出现在重排后的母串中. 首先第一步肯定是获取母串中每个字母出现的次数,只有A T C G四种. 这个很容易想到一个dp状态dp[i][A ...
- HDU P3341 Lost's revenge 题解+数据生成器
Lost and AekdyCoin are friends. They always play "number game"(A boring game based on numb ...
随机推荐
- Java-IDEA环境搭建swagger
1.项目POM导入包(使用Maven管理的代码) 2.POM文件导入包 <dependencyManagement> <dependencies> <dependency ...
- debian使用apt安装时出现“更换介质,插入驱动器"/media/chrom/"再按回车键”的提示,无法从网络安装,解决?
原文链接:https://www.zhihu.com/question/22132663 nano /etc/apt/sources.list把那出现的那行注释掉:含CD盘的一行:然后apt-get ...
- CF747D Winter Is Coming
题目链接: http://codeforces.com/problemset/problem/747/D 题目大意: 接下来的n天内每天都有一个气温,如果某天的温度为负数,则必须使用冬季轮胎:而温度 ...
- Jenkins默认工作空间及更改默认工作空间
1.Jenkins安装到tomcat 需2步: ①官网下载Jenkins(一个war包) ②安装 所谓安装,也有两种形式: 一是在安装了jdk的情况下直接运行:java -jar jenkins.wa ...
- SM2-DE
SM2单证书认证 下端 导入根证书以及通用证书[具有签名和加密证书的功能]和远端的证书[获取远端公钥信息] 1.配置证书域 crypto ca identity gernal exit 2.通过复制粘 ...
- SQL2005中使用backup、restore来备份和恢复数据库
在SQL2005数据库中利用SQL语句进行数据备份与还原: 备份backup:backup database 数据库名称 tO disk = 备份路径例:BACKUP DATABASE test TO ...
- SAP产品的Field Extensibility
SAP开发人员的工作职责,除了实现软件的功能性需求外,还会花费相当的精力实现一些非功能性需求,来满足所谓的SAP Product Standard(产品标准).这些产品标准,包含在SAP项目实施中大显 ...
- java里面byte数组和String字符串怎么转换
//string 转 byte[] String str = "Hello"; byte[] srtbyte = str.getBytes(); // byte[] 转 strin ...
- CVE-2010-3333
环境 windows xp sp3 office 2003 sp0 windbg ollydbg vmware 12.0 0x00 RTF格式 RTF是Rich TextFormat的缩写,意即富文本 ...
- javase(12)_集合框架_Queue
一.Queue Queye接口体系图 体系分析: Deque实现类:ArrayDeque, LinkedList(数组和链表实现双向队列) BlockingDeque实现类:LinkedBlockin ...