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. BootStrap 智能表单系列 八 表单配置json详解

    本章属于该系列的高级部分,将介绍表单中一些列的配置 1.config列的配置: 主要用于控制布局 :config:{autoLayout:true|'1,2,2,4'} true:根据配置项最里层的数 ...

  2. BZOJ 2751: [HAOI2012]容易题(easy)( )

    有限制的最多就K个, 所以我们处理一下这K个就行了. 其他可以任选, 贡献都是∑i (1≤i≤N), 用快速幂. ------------------------------------------- ...

  3. 在raw_input()中使用中文提示,在CMD下中文乱码问题解决。。。

    错误的程序及结果: 解决1: guess = int(raw_input('请输入一个整数:'.decode('utf-8').encode('gbk'))) 解决2: guess = int(raw ...

  4. Linux 系统之Systemd

    子贡问为仁.子曰:“工欲善其事,必先利其器.居是邦也,事其大夫之贤者,友其士之仁者.”——孔子(春秋)<论语·卫灵公> [工欲善其事,必先利其器] 掌握一门技术,知道其发展历程是非常重要的 ...

  5. c 语言简单计算器源码

    //  main.c //  计算器 //  Created by qianfeng on 14-7-15. //  Copyright (c) 2014年 ___FGY___. All rights ...

  6. IOS 学习笔记(5) 控件 文本视图(UITextView)的使用方法

    相对于UILabell所支持的较短文本内容,UITextView对于长文本的支持更好.UITextView能够以滚动的方式全部浏览到长文本,并且就像UILabel那样,从ISO6,他也提供了对NSAt ...

  7. UIWebView的三种加载方式

    一.使用UIWebView 将web content 嵌入到应用上. API提供了三种方法: - (void)loadRequest:(NSURLRequest *)request; - (void) ...

  8. 升级Xcode6.3插件失效解决办法

     1.打开终端,输入以下代码获取到DVTPlugInCompatibilityUUID         defaults read /Applications/Xcode.app/Contents/I ...

  9. OTL使用总结

    在VC中访问Oracle,可以使用ADO或ODBC,如果你比较强大,也可以直接使用OCI API,但我个人认为OTL是最佳选择,它是一套数据库访问C++模板库,全部代码都在otlv4.h头文件中,通过 ...

  10. Uber选拔专车司机:五年以上驾驶经验 两小时视频培训

    摘要:说起当时下流行打车软件Uber的司机,还得从春节前在上海一次打车说起.那几天,记者在上海某商场逛到打烊时间,大包小包拎着袋子根本腾不出手拦出租车,而商场门口的出租车临时停靠点更是挤满“血拼”而归 ...