hdu 2457(ac自动机+dp)
题意:容易理解...
分析:这是一道比较简单的ac自动机+dp的题了,直接上代码。
代码实现:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<queue>
using namespace std;
struct node{
int next[];
int fail;
int flag;
void init()
{
memset(next,,sizeof(next));
fail=;
flag=;
}
}a[];
char keyword[];
char S[];
int tot,len;
int dp[][]; int Min(int a,int b)
{
return a<b?a:b;
} void chushihua()
{
int i,j;
tot=;
a[].init();
for(i=;i<;i++)
for(j=;j<;j++)
dp[i][j]=;
dp[][]=;
} int hash(char x)
{
if(x=='A')
return ;
else if(x=='C')
return ;
else if(x=='G')
return ;
else
return ;
} void insert(char *str)
{
int index,p=;
for(;*str!='\0';str++)
{
index=hash(*str);
if(a[p].next[index]==)
{
a[++tot].init();
a[p].next[index]=tot;
}
p=a[p].next[index];
}
a[p].flag=;
} void build_fail()
{
queue<int>Q;
int p,cur,son,i;
Q.push();
while(!Q.empty())
{
p=Q.front();
Q.pop();
for(i=;i<;i++)
{
if(a[p].next[i]!=)
{
son=a[p].next[i];
cur=a[p].fail;
if(p==)
a[son].fail=;
else
{
while(cur&&a[cur].next[i]==)
cur=a[cur].fail;
a[son].fail=a[cur].next[i];
}
if(a[a[son].fail].flag==)
a[son].flag=;
if(a[son].flag==)
Q.push(son);
}
else
a[p].next[i]=a[a[p].fail].next[i];
}
}
} void solve(int t)
{
int i,j,k,son,res=;
char x;
for(i=;i<=len;i++)
{
for(j=;j<=tot;j++)
{
if(dp[i-][j]==||a[j].flag==)
continue;
for(k=;k<;k++)
{
son=a[j].next[k];
if(a[son].flag==)
continue;
if(k==)
x='A';
else if(k==)
x='C';
else if(k==)
x='G';
else
x='T';
if(x==S[i-])
{
if(dp[i][son]==)
dp[i][son]=dp[i-][j];
else
dp[i][son]=Min(dp[i][son],dp[i-][j]);
}
else
{
if(dp[i][son]==)
dp[i][son]=dp[i-][j]+;
else
dp[i][son]=Min(dp[i][son],dp[i-][j]+);
}
}
}
}
for(i=;i<=tot;i++)
if(dp[len][i]<res)
res=dp[len][i];
printf("Case %d: ",t);
if(res==)
printf("%d\n",-);
else
printf("%d\n",res);
} int main()
{
int n,t=;
while(scanf("%d",&n)!=EOF&&n)
{
t++;
chushihua();
getchar();
while(n--)
{
scanf("%s",keyword);
insert(keyword);
}
build_fail();
scanf("%s",S);
len=strlen(S);
solve(t);
}
return ;
}
hdu 2457(ac自动机+dp)的更多相关文章
- DNA repair HDU - 2457 AC自动机+DP
题意: 给你N个模板串,并且给你一个文本串, 现在问你这个文本串最少需要改变几个字符才能使得它不包含任何模板串. (以上字符只由A,T,G,C构成) 题解: 刚开始做这一题的时候表示很懵逼,好像没有学 ...
- hdu 2296 aC自动机+dp(得到价值最大的字符串)
Ring Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 2825 AC自动机+DP
题意:一个密码,长度为 n,然后有m个magic words,这个密码至少由k个magic words组成. 问这个密码可能出现的总数. 思路:首先构造AC自动机,由于m很小,才10 ,我们可以使用二 ...
- Lost's revenge HDU - 3341 AC自动机+DP(需要学会如何优雅的压缩状态)
题意: 给你n个子串和一个母串,让你重排母串最多能得到多少个子串出现在重排后的母串中. 首先第一步肯定是获取母串中每个字母出现的次数,只有A T C G四种. 这个很容易想到一个dp状态dp[i][A ...
- DNA repair - HDU 2457(自动机+dp)
题目大意:给你N个DNA的串,也就是至包含'A','T','G','C'四种碱基的,这些给定的串都是带有遗传病的,然后给你一个不会超过1000的串,问你至少几个地方才能让这个串不包含遗传病,如果不论怎 ...
- HDU 2457 DNA repair(AC自动机+DP)题解
题意:给你几个模式串,问你主串最少改几个字符能够使主串不包含模式串 思路:从昨天中午开始研究,研究到现在终于看懂了.既然是多模匹配,我们是要用到AC自动机的.我们把主串放到AC自动机上跑,并保证不出现 ...
- HDU 2425 DNA repair (AC自动机+DP)
DNA repair Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 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 2825 aC自动机+状压dp
Wireless Password Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
随机推荐
- C# Log4Net配置
Log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件.数据库.EventLog等),日志就是程序的黑匣子,可以通过日志查看系统的运行过程,从而发现系统的问题.日志的作用:将运 ...
- Kibana
https://github.com/moonstack/moon-kibana.git
- 简单易懂的现代魔法——Play Framework攻略1
哇哈哈,寒假结束啦,于是我又开新坑了....这次的主角可是大名鼎鼎的Play Framework!!那么闲话少说,开始攻略吧! 1.什么是Play Framework? 大名鼎鼎的play frame ...
- 搭建hadoop环境,在win7的eclipse上远程操作(Linux上)hadoop2.6.0出错的一些总结
问题1:在DFS Lcation 上不能对文件进行操作: 解决方法: 在hadoop上的每个节点上修改该文件 conf/mapred-site.xml,增加: <property> < ...
- lintcode:最大子正方形
题目: Maximal Square Given a 2D binary matrix filled with 0's and 1's, find the largest square contain ...
- HTML5入门2---js获取HTML元素的值
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- intellij idea 注释行如何自动缩进?
我们指代代码注释的快捷键是 Ctrl+/ 但是加注释后"//"自动放在行首,没缩进,就像这样
- 7、SpringMVC源码分析(2):分析HandlerAdapter.handle方法,了解handler方法的调用细节以及@ModelAttribute注解
从上一篇 SpringMVC源码分析(1) 中我们了解到在DispatcherServlet.doDispatch方法中会通过 mv = ha.handle(processedRequest, res ...
- Hibernate HQL查询的参数绑定
参数绑定: Hibernate中对动态查询参数绑定提供了丰富的支持,那么什么是查询参数动态绑定呢?其实如果我们熟悉传统JDBC编程的话,我们就不难理解查询参数动态绑定,如下代码传统JDBC的参数绑定: ...
- TCP-心跳
心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包. 用来判断对方(设备,进程或其它网元)是否正常运行,采用定时发送简单的通 ...