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. Javascript初级学习总结

    首先,在Html页面输出,使用document.write('内容'); <html> <head> <title></title> <scrip ...

  2. web附件中文名

    response.setHeader("Content-Disposition", "attachement;filename="+URLEncoder.enc ...

  3. jquery ajax方法和其他api回顾

    >> $ele.load(url, data, callback); //带data参数时为POST请求,否则为GET请求 // $('#testload').load('data.htm ...

  4. ImageMagick还是GraphicsMagick?

    引自:http://co63oc.blog.51cto.com/904636/328997 ImageMagick(IM) 套装包含的命令行图形工具是一主要自由软件:Linux,其他类Unix操作系统 ...

  5. php浮点数计算比较及取整不准确解决方法

    原文:php浮点数计算比较及取整不准确解决方法 php有意思的现象,应该是很多编程语言都会有这样的现象.这个是因为计算机的本身对浮点数识别的问题..... $f = 0.58; var_dump(in ...

  6. Ibatis入门基本语法(转) good

    Ibatis入门基本语法 一个项目中在写ibatis中的sql语句时,where user_id in (#user_id_list# ), 运行时总是不行,后来上网查了查,才知道这里不该用#,而应该 ...

  7. Linux批量重命名文件

    五种方法实现Linux批量重命名文件 Linux批量重命名文件是指对某些特定的文件统一进行重新命名,以改变原来一批文件的名称,这里介绍五种方法来实现. Linux批量重命名文件会涉及到改变一个字母.改 ...

  8. cocos2dx中的其他层

    在cocos2dx中,CCLayer默认是黑色的,但是有时候需要有其他颜色北京的图层,那么就需要用到CCLayerColor 如下代码: ccColor4B color =ccc4(255, 0, 0 ...

  9. 在Livemedia的基础上开发自己的流媒体客户端

    一.背景 二.Livemedia框架介绍 1.总体框架 2.客户端框架 2.1 客户端openRTSP流程 2.2增加一种新的媒体 2.2.1增加媒体的format 2.2.2 新媒体需要考虑的问题 ...

  10. HDU 1157 Who's in the Middle

    #include <cstdio> #include <algorithm> using namespace std; int main() { int n; while(sc ...