题目链接

一个数组开小了一点点,一直提示wa,郁闷,这题比上个题简单一点。

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstdlib>
using namespace std;
#define N 1001
#define INF 1000000
int trie[N][];
int que[N];
int o[<<];
int flag[N];
int fail[N];
int dp1[N][<<];
int dp2[N][<<];
int t,n;
int lowbit(int t)
{
return t&(-t);
}
void CL()
{
t = ;
memset(trie,-,sizeof(trie));
memset(o,,sizeof(o));
memset(flag,,sizeof(flag));
}
int judge(char s)
{
switch(s)
{
case'A':
return ;
case'C':
return ;
case'G':
return ;
case'T':
return ;
}
return ;
}
void insert(char *str,int x,int j)
{
int i,len,root;
root = ;
len = strlen(str);
for(i = ; i < len; i ++)
{
if(trie[root][judge(str[i])] == -)
trie[root][judge(str[i])] = t ++;
root = trie[root][judge(str[i])];
}
flag[root] = <<j;
}
void build_ac()
{
int head,tail,front,i;
head = tail = ;
for(i = ; i < ; i ++)
{
if(trie[][i] != -)
{
fail[trie[][i]] = ;
que[tail++] = trie[][i];
}
else
{
trie[][i] = ;
}
}
while(head != tail)
{
front = que[head++];
flag[front] |= flag[fail[front]];
for(i = ; i < ; i ++)
{
if(trie[front][i] != -)
{
que[tail++] = trie[front][i];
fail[trie[front][i]] = trie[fail[front]][i];
}
else
{
trie[front][i] = trie[fail[front]][i];
}
}
}
}
int main()
{
int m,i,j,u,x,len,k;
int sc[];
char str[];
while(scanf("%d%d",&n,&m)!=EOF)
{
CL();
for(i = ; i < n; i ++)
{
scanf("%s%d",str,&x);
len = strlen(str);
if(len > m)
{
i --;
n -- ;
continue;
}
sc[i] = x;
insert(str,x,i);
}
for(i = ;i < n;i ++)
o[<<i] = sc[i];
for(i = ; i < <<n;i ++)
{
o[i] = o[i-lowbit(i)] + o[lowbit(i)];
}
build_ac();
for(j = ; j < t; j ++)
{
for(k = ; k < (<<n); k ++)
{
dp1[j][k] = ;
dp2[j][k] = ;
}
}
dp1[][] = ;
for(i = ; i < m; i ++)
{
for(j = ; j < t; j ++)
{
for(k = ;k < (<<n);k ++)
{
if(dp1[j][k] == ) continue;
int temp;
for(u = ;u < ;u ++)
{
temp = k|flag[trie[j][u]];
dp2[trie[j][u]][temp] += dp1[j][k];
}
}
}
for(j = ; j < t; j ++)
{
for(k = ; k < (<<n); k ++)
{
dp1[j][k] = dp2[j][k];
dp2[j][k] = ;
}
}
}
int ans = -INF;
for(j = ;j < t;j ++)
{
for(k = ;k <(<<n);k ++)
{
if(dp1[j][k])
ans = max(ans,o[k]);
}
}
if(ans >= )
printf("%d\n",ans);
else
printf("No Rabbit after 2012!\n");
}
return ;
}

HDU 4057 Rescue the Rabbit(AC自动机+DP)的更多相关文章

  1. HDU 4057 Rescue the Rabbit ( AC自动机 + 状态压缩DP )

    模板来自notonlysuccess. 模式串只有10个,并且重复出现的分值不累加,因此很容易想到状态压缩. 将模式串加入AC自动机,最多有10*100个状态. dp[i][j][k]:串长为i,在T ...

  2. 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 ...

  3. HDU 2457 DNA repair(AC自动机+DP)题解

    题意:给你几个模式串,问你主串最少改几个字符能够使主串不包含模式串 思路:从昨天中午开始研究,研究到现在终于看懂了.既然是多模匹配,我们是要用到AC自动机的.我们把主串放到AC自动机上跑,并保证不出现 ...

  4. HDU 2425 DNA repair (AC自动机+DP)

    DNA repair Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. hdu 4057 Rescue the Rabbit

    题意 给出n(n<=10)个串,每个串有个权值,然后让你构造一个长度为l(l<=100)的串,如果他包含给出的串就得到相应的权值,求可能得到的最大权值 解法 AC自动机+DP,很显然要建立 ...

  6. HDU 4758 Walk Through Squares(AC自动机+DP)

    题目链接 难得出一个AC自动机,我还没做到这个题呢...这题思路不难想,小小的状压出一维来,不过,D和R,让我wa死了,AC自动机,还得刷啊... #include<iostream> # ...

  7. HDU 2825 Wireless Password【AC自动机+DP】

    给m个单词,由这m个单词组成的一个新单词(两个单词可以重叠包含)长度为n,且新单词中包含的基本单词数目不少于k个.问这样的新单词共有多少个? m很小,用二进制表示新单词中包含基本单词的情况. 用m个单 ...

  8. hdu4057Rescue the Rabbit(ac自动机+dp)

    链接 当时是因为没有做出来这道题才开了自动机的专题,现在看看还是比较简单的. 因为每个病毒串只算一次,只有10个病毒串,可以状压一下哪些状态是可以达到的,最后取一个最大值. #include < ...

  9. HDU 6086 Rikka with String AC自动机 + DP

    Rikka with String Problem Description As we know, Rikka is poor at math. Yuta is worrying about this ...

随机推荐

  1. Windows环境下的jekyll本地搭建

    一.配置ruby环境 由于jekyll是用ruby语言写的一个静态网页生成工具,所以要搭建jekyll本地环境就需要先配置好ruby环境. 1)去官网下载Ruby:https://www.ruby-l ...

  2. virsh常用命令

    必须启动libvirtd,才能用virsh查看kvm后台. # systemctl start libvirtd 查看网络 # virsh net-list 启动default网络 # virsh n ...

  3. Datasets for Data Mining and Data Science

    https://github.com/mattbane/RecommenderSystem http://grouplens.org/datasets/movielens/ KDDCUP-2012官网 ...

  4. CentOS6.5以runlevel 3开机时自动连接某无线设置示例

    [参考]http://blog.csdn.net/simeone18/article/details/8580592 [方法一] 假设无线网卡代号为wlan0,无线AP的essid为:TheWiFi, ...

  5. python模拟浏览器保存Cookie进行会话

    #! /usr/bin/env python # -*-coding:utf- -*- import urllib import urllib2 import cookielib class NetR ...

  6. Python学习之字典详解

    在元组和列表中,都是通过编号进行元素的访问,但有的时候我们按名字进行数据甚至数据结构的访问,在c++中有map的概念,也就是映射,在python中也提供了内置的映射类型--字典.映射其实就是一组key ...

  7. 【转】javax.net.ssl.SSLHandshakeException(Cas导入证书)

    本文转自:http://my.oschina.net/laiwanshan/blog/159057 一.报错: javax.net.ssl.SSLHandshakeException 二.原因分析:C ...

  8. JQuery发送ajax请求不能用数组作为参数

    JQuery发送ajax请求不能用数组作为参数,否则会接收不到参数, 一.js代码如下: $('#delete-button').click(function(){        var select ...

  9. HDU1250 高精度斐波那契数列

    Hat's Fibonacci Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  10. php 工厂模式

    <body> <?php //设计模式:工厂模式 /* class YunSuan { public $a; public $b; function Jia() { return ( ...