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 ...
随机推荐
- Spring使用_进阶
概述 本文主要写了几个关于Spring Aware,多线程,计划任务(定时任务),条件注解,组合注解,元注解,Spring测试的小例子以及关于@Enable*注解的工作原理的理解. Spring Aw ...
- 用redis实现简单的队列
在工作中,时常会有用到队列的场景,比较常见的用rabbitMQ这些专业的组件,官网地址是:http://www.rabbitmq.com,重要的是官方有.net的客户端,但是如果对rabbitMQ不熟 ...
- Spring AOP初步总结(二)
该篇为Spring AOP的一个应用案例:系统日志 需求:将任何删除,更改或新增数据库的操作汇总到数据库中 步骤1:编写切面 @Aspect @Component public class SysLo ...
- MFC双缓冲解决图象闪烁[转]
转载网上找到的一篇双缓冲的文章,很好用.http://www.cnblogs.com/piggger/archive/2009/05/02/1447917.html__________________ ...
- 在Eclipse上运行Spark(Standalone,Yarn-Client)
欢迎转载,且请注明出处,在文章页面明显位置给出原文连接. 原文链接:http://www.cnblogs.com/zdfjf/p/5175566.html 我们知道有eclipse的Hadoop插件, ...
- 关于软件测试(5):初识Peer Review
一.背景:这周的软件测试课堂上我们在自行分组的情况下,对姚同学的汽车停车位定位管理系统进行了Peer Review,中文就是同行测试.这也是我第一次接触同行测试,那接下来我先介绍一下Peer Revi ...
- 目后佐道IT教育:教学环境
目后佐道IT教育的品牌故事 http://www.cnblogs.com/itpua/p/7710917.html 目后佐道IT教育的师资团队 http://www.cnblogs.com/itpua ...
- python之道05
1.写代码,有如下列表,按照要求实现每一个功能 li = ["alex", "WuSir", "ritian", "barry&q ...
- linux环境nginx的安装与使用
因为公司需要需要安装一系列环境,新手上路第一次配的时候什么也不懂在网上找了半天,觉得这篇不错,我在这里顺便记录一下.(原文:https://www.cnblogs.com/wyd168/p/66365 ...
- javascript的trigger事件
<html> <head> <script type="text/javascript" src="/jquery/jquery.js&qu ...