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 ...
随机推荐
- VS局域网断点调试设置
1.电脑文档文件夹下\IISExpress\config文件内找到applicationhost.config文件编辑 找到<sites>节点 找到你要编辑的site节点 在<bin ...
- IE下的圆角
元素{ position: relative;/*必须*/ z-index: 10;/*必须*/ border-radius: 8px; -moz-border-radius: 8px; -webki ...
- MyBatis插入数据之后返回插入记录的id
MyBatis插入数据的时候,返回该记录的id<insert id="insert" keyProperty="id" useGeneratedKeys= ...
- 如何让浏览器关闭后session失效
llzzcc66 知道合伙人数码行家 推荐于2018-08-10 如果用户不点击网站的“退出”链接,而直接关闭浏览器(或者强制关闭浏览器进程.死机等),服务器无法处理用户退出网站的请求,解决方式如 ...
- off-by-one&doublefree. 看雪10月ctf2017 TSRC 第四题赛后学习
off-by-one 0x00 发现漏洞 1.off-by-one 在massage函数中,如图所示,可以修改的字节数比原内存大小多了一个字节 2.悬挂指针 可以看到,在free堆块的时候,没有清空指 ...
- WinForm各种关闭
Appication.Exit(); Environment.Exit(); System.Threading.Thread.CurrentThread.Abort(); Process.GetCur ...
- UINavgationController
UINavigationBar和UINavigationItem是iOS开发中常用的控件. 1.设置导航栏标题 self.title = @"iOS开发:iOSDevTip"; ...
- javascript(函数式编程思考) ---> Map-Filter-quicksort-Collatz序列-Flodl-Flodr
let add = x=>x+1; //Map :: ( a -> b) -> [a] -> [b] let Map = function(f,arr){ //闭包存储累积对象 ...
- python入门(一)作业
一,流程控制之if...else 1. 如果:女人的年龄>30岁,那么:叫阿姨,否则:叫小妞 age_of_girl = 21 if age_of_girl >30: print('阿姨' ...
- CSS3-媒体类型
一.媒体类型(Media Type) 1.link方法引入 <link rel="stylesheet" type="text/css" href=&qu ...