ac自动机+dp 自动机上的节点来作为状态

dp[i][j]表示长度为i状态为j至少需要转换多少个字符

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int root=0,N=4;
char a[1111];
int dp[1111][1111],c[1111][10];
struct
{
int next[5],tmp,fail;
}trie[1111];
int lon;
void trieini()
{
memset(trie,0,sizeof(trie));
lon=0;
} void insert(char s[])
{
int t=root;
int n=strlen(s+1);
for(int i=1;i<=n;i++)
{
if(trie[t].next[s[i]-'A']==0)
trie[t].next[s[i]-'A']=++lon;
t=trie[t].next[s[i]-'A'];
if(i==n)
trie[t].tmp++;
}
} void getfail()
{
queue <int> q;
q.push(root);
while(!q.empty())
{
int t=q.front();
q.pop();
for(int i=0;i<N;i++)
if(trie[t].next[i])
{
int u=trie[t].next[i];
int tmp=trie[t].fail;
while(tmp!=root&&trie[tmp].next[i]==0)
tmp=trie[tmp].fail;
trie[u].fail=trie[tmp].next[i];
if(t==root) trie[u].fail=root;
trie[u].tmp+=trie[trie[u].fail].tmp;
q.push(u);
}
}
} void find()
{
for(int i=0;i<=lon;i++)
{
for(int k=0;k<N;k++)
{
int t=i;
while(t&&trie[t].next[k]==0) t=trie[t].fail;
if(trie[t].next[k])
c[i][k]=trie[t].next[k];
else
c[i][k]=root;
}
}
} void work(char a[])
{
int n=strlen(a+1);
for(int i=1;i<=n;i++)
{
if(a[i]=='T')
a[i]='B';
else if(a[i]=='G')
a[i]='D';
}
} int main()
{
int n;
int tcase=0;
while(scanf("%d",&n),n)
{
trieini();
for(int i=1;i<=n;i++)
{
char s[22];
scanf("%s",s+1);
work(s);
insert(s);
}
getfail();
find();
scanf("%s",a+1);
work(a);
memset(dp,50,sizeof(dp));
dp[0][0]=0;
int m=strlen(a+1);
for(int k=0;k<m;k++)
for(int i=0;i<=lon;i++)
if(trie[i].tmp==0)
{
for(int p=0;p<N;p++)
{
int tmp=p+'A'!=a[k+1];
dp[k+1][c[i][p]]=min(dp[k+1][c[i][p]],dp[k][i]+tmp);
}
}
int ans=1111; for(int i=0;i<=lon;i++)
if(trie[i].tmp==0)
{
ans=min(ans,dp[m][i]);
// printf("%d %d %d\n",m,i,dp[m][i]);
} printf("Case %d: ",++tcase);
if(ans==1111)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}

poj 3691的更多相关文章

  1. POJ 3691 (AC自动机+状态压缩DP)

    题目链接:  http://poj.org/problem?id=3691 题目大意:给定N个致病DNA片段以及一个最终DNA片段.问最终DNA片段最少修改多少个字符,使得不包含任一致病DNA. 解题 ...

  2. POJ 3691 &amp; HDU 2457 DNA repair (AC自己主动机,DP)

    http://poj.org/problem?id=3691 http://acm.hdu.edu.cn/showproblem.php?pid=2457 DNA repair Time Limit: ...

  3. [poj 3691]DNA repair

    好久没刷 poj 了,今天练习 AC 自动机时去水了一发喵~ 在 poj 上 A 题的感觉并没有 BZOJ 上那么愉悦,准确的说是痛不欲生 真是应了那句老话,你再慢也有比你慢的,你再快也有比你快的…… ...

  4. POJ 3691 DNA Sequence (AC自动机 + 矩阵 有bug,待修改)

    DNA Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9889   Accepted: 3712 Desc ...

  5. Match:DNA repair(POJ 3691)

    基因修复 题目大意:给定一些坏串,再给你一个字符串,要你修复这个字符串(AGTC随便换),使之不含任何坏串,求修复所需要的最小步数. 这一题也是和之前的那个1625的思想是一样的,通过特殊的trie树 ...

  6. POJ 3691 DNA repair(AC自动机+DP)

    题目链接 能AC还是很开心的...此题没有POJ2778那么难,那个题还需要矩阵乘法,两个题有点相似的. 做题之前,把2778代码重新看了一下,回忆一下当时做题的思路,回忆AC自动机是干嘛的... 状 ...

  7. POJ 3691 AC自动机上的dp

    题目大意: 给定一些不合理的DNA序列,再给一段较长的dna序列,问最少修改几次可以使序列中不存在任何不合理序列,不能找到修改方法输出-1 这里你修改某一个点的DNA可能会影响后面,我们不能单纯的找匹 ...

  8. POJ 3691 DNA repair 基于AC自己主动机DP

    dp[i][j] 它表示的长度 i 下游前缀 j 更改节点的最小数量. 很清楚dp[0][0] = 0; dp[ i ][ j ] = min(dp[ i ][ j ],dp[i-1][k] + (j ...

  9. POJ 3691 DNA repair (DP+AC自动机)

    DNA repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4815   Accepted: 2237 Descri ...

随机推荐

  1. 关于js封装框架类库之属性操作

    在对DOM对象操作时,往往都要涉及到其属性的操作,为了提高开发效率,同时兼顾浏览器的性能,在这简单的封装了几个常见的属性.因为是模块化,在这只是引入了部分代码,其他代码在前几篇模块封装中有写.如有不足 ...

  2. ASP.NET快速开发框架、这才是高大上档次后台管理UI界面

    另外献上在<线体验Demo地址>希望大家也能从中得到一些启发.地址:http://121.40.148.178:8080/ . 用户名:guest,密码:123456QQ技术交流群:239 ...

  3. iOS网络开发-打造自己的视频客户端

    一.展示实现 效果      客户端:                                      服务器端:            二.创建表 create table CourseV ...

  4. iOS 百度地图大头针使用

    百度地图使用第五讲:大头针使用(地图标注)http://bbs.yusian.com/thread-8384-1-1.html(出处: 小龙虾IT笔记)

  5. Java 日期字符串与日期类型转换

    1.SimpleDateFormat.format 把日期类型转化到指定格式字符串 public static String convToString(Calendar cld,String temp ...

  6. # void :;

    href="#"---->top 连续点击的时候会出bug javascri中的void是一个操作符,该操作符指定要计算一个表达式但是不返回值. javascript:voi ...

  7. C#共享内存类改进版

    原文 C#共享内存类改进版 改进说明及源码实例下载见:http://blog.csdn.net/zzh8845/archive/2008/11/22/3349963.aspx ShareMem.cs ...

  8. Dubbo原理解析-监控

    Dubbo发布代码中,自带了一个简易的监控中心实现.对于一般的小业务这个监控中心应该能够满足需求,对于那些大业务量的大公司一般都会有自己的监控中心,更加丰富的功能如常用的报警短信通知等等.这章讲解分析 ...

  9. dubbo服务者配置说明

    <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright 1999-2011 Aliba ...

  10. spring boot 下 500 404 错误页面处理

    spring boot 作为微服务的便捷框架,在错误页面处理上也有一些新的处理,不同于之前的spring mvc 500的页面处理是比较简单的,用java config或者xml的形式,定义如下的be ...