题意:容易理解...

分析:这是一道比较简单的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)的更多相关文章

  1. DNA repair HDU - 2457 AC自动机+DP

    题意: 给你N个模板串,并且给你一个文本串, 现在问你这个文本串最少需要改变几个字符才能使得它不包含任何模板串. (以上字符只由A,T,G,C构成) 题解: 刚开始做这一题的时候表示很懵逼,好像没有学 ...

  2. hdu 2296 aC自动机+dp(得到价值最大的字符串)

    Ring Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  3. HDU 2825 AC自动机+DP

    题意:一个密码,长度为 n,然后有m个magic words,这个密码至少由k个magic words组成. 问这个密码可能出现的总数. 思路:首先构造AC自动机,由于m很小,才10 ,我们可以使用二 ...

  4. Lost's revenge HDU - 3341 AC自动机+DP(需要学会如何优雅的压缩状态)

    题意: 给你n个子串和一个母串,让你重排母串最多能得到多少个子串出现在重排后的母串中. 首先第一步肯定是获取母串中每个字母出现的次数,只有A T C G四种. 这个很容易想到一个dp状态dp[i][A ...

  5. DNA repair - HDU 2457(自动机+dp)

    题目大意:给你N个DNA的串,也就是至包含'A','T','G','C'四种碱基的,这些给定的串都是带有遗传病的,然后给你一个不会超过1000的串,问你至少几个地方才能让这个串不包含遗传病,如果不论怎 ...

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

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

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

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

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

  9. hdu 2825 aC自动机+状压dp

    Wireless Password Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

随机推荐

  1. POJ 1666

    #include<iostream> using namespace std; int main() { int num_stu; int i; ; do{ time=; cin>& ...

  2. SDUT1281Cup

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1281 题意 : 一个杯子,告诉你底面半径,顶端 ...

  3. [转]C++四种cast操作符

    http://blog.csdn.net/starryheavens/article/details/4617637 C 风格(C-style)强制转型如下: (T) expression 或 T(e ...

  4. JavaScript基础精华01(变量,语法,数据类型)

    JavaScript是一种脚本语言. 脚本,一条条的文字命令.执行时由系统的一个解释器,将其一条条的翻译成机器可识别的指令,然后执行 JavaScript基本组成 1.基本语法(浏览器基本都支持,有统 ...

  5. alias 命令

    功能说明:设置指令的别名. 语 法:alias[别名]=[指令名称] 参 数 :若不加任何参数,则列出目前所有的别名设置. 举    例 :ermao@lost-desktop:~$ alias    ...

  6. android移植

    root@phone-desktop:/opt/4418-source/android4.4.2_r1# ./device/nexell/tools/build.sh -b drone2 -t u-b ...

  7. andorid源码中察看版本

    build\core\version_defaults.mk //搜索该文件中的 PLATFORM_VERSION值

  8. Java中boolean型变量的默认值问题

    1.首先分析Java中的三种不同变量的区别,如下表所示   概念 默认值 其他 类变量 也叫静态变量,是类中独立于方法之外的变量 用static 修饰 有默认初始值,系统自动初始化. 如boolean ...

  9. Android通过JNI调用驱动程序(完全解析实例)

    要达到的目的:android系统中,用JAVA写界面程序,调用jni中间库提供的接口,去操作某个驱动节点,实现read,writer ioctl等操作!这对底层驱动开发人员是很重要的一个调试通道,也是 ...

  10. oracle视图总结(转)

    视图简介: 视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改.视图基于的表称为基表.视图是存储在数据字典里的一条select语句. 通过创建视图可以提取数 ...