好久没刷 poj 了,今天练习 AC 自动机时去水了一发喵~

在 poj 上 A 题的感觉并没有 BZOJ 上那么愉悦,准确的说是痛不欲生

真是应了那句老话,你再慢也有比你慢的,你再快也有比你快的……

跪求那些 0ms 的代码啊,还有那么多人都只跑了 32ms 啊!!

果然还是我太弱了吗?一定是我还太弱了 TAT

一道裸裸的 AC 自动机上 dp

令 dp[i][j] 表示母串的前 i 个字母遍历 AC 自动机,使之到达 j 节点,至少要修改多少个字母

dp[i+1][k]=min(dp[i+1][k], dp[i][j]+CHAR(j->k)!=s[i])  { k 不为匹配点}

CHAR(j->k) 是指在 AC 自动机上从点 j 转移到点 k 的边时经过的字母

答案就是 min{dp[len(s)][i]} 了喵~

我才不会说我是来晒我的 AC 自动机代码的呢~  (虽然被 poj 的各大神犇搞得一点优越感都没有……)

 #include <cstdio>
#include <cstring>
const int inf=0x3F3F3F3F;
const int sizeOfText=;
const int sizeOfType=;
const int sizeOfMemory=; namespace trieDfa
{
struct node
{
int idx;
bool end;
node * fail;
node * ch[sizeOfType];
};
node * dfa;
node memory[sizeOfMemory]; int port;
node * E[sizeOfMemory];
inline node * newnode()
{
node * ret=memory+port;
E[ret->idx=port++]=ret;
ret->end=;
ret->fail=NULL;
memset(ret->ch, , sizeof(ret->ch));
return ret;
}
inline void clear() {port=; dfa=newnode();} inline int ord(char ch)
{
switch (ch)
{
case 'A':return ;
case 'G':return ;
case 'C':return ;
case 'T':return ;
}
}
inline void insert(char * s)
{
int len=strlen(s);
node * t=dfa;
for (int i=;i<len;i++)
{
if (!t->ch[ord(s[i])]) t->ch[ord(s[i])]=newnode();
t=t->ch[ord(s[i])];
}
t->end=;
}
inline void buildDfa()
{
static node * queue[sizeOfMemory];
int l=, r=; dfa->fail=dfa;
for (int i=;i<sizeOfType;i++)
if (!dfa->ch[i]) dfa->ch[i]=dfa;
else dfa->ch[i]->fail=dfa, queue[r++]=dfa->ch[i]; for ( ;l<r; )
{
node * u=queue[l++];
u->end|=u->fail->end;
for (int i=;i<sizeOfType;i++)
if (u->ch[i])
{
u->ch[i]->fail=u->fail->ch[i];
queue[r++]=u->ch[i];
}
else
u->ch[i]=u->fail->ch[i];
}
}
}
using namespace trieDfa; int cases, n;
char str[sizeOfText];
int f[sizeOfText][sizeOfMemory];
inline int min(int x, int y) {return x<y?x:y;}
inline int dp(char * ); int main()
{
for (scanf("%d", &n);n;scanf("%d", &n))
{
clear();
for (int i=;i<=n;i++)
{
scanf("%s", str);
insert(str);
}
buildDfa();
scanf("%s", str);
printf("Case %d: %d\n", ++cases, dp(str));
} return ;
}
inline int dp(char * s)
{
int len=strlen(s);
int ret=inf; memset(f, inf, sizeof(f));
f[][]=;
for (int i=;i<len;i++)
for (int j=;j<port;j++)
for (int k=;k<sizeOfType;k++)
if (!E[j]->ch[k]->end)
f[i+][E[j]->ch[k]->idx]=min(f[i+][E[j]->ch[k]->idx], f[i][j]+(ord(s[i])!=k));
for (int i=;i<port;i++) ret=min(ret, f[len][i]); return ret==inf?-:ret;
}

本傻装B系列

[poj 3691]DNA repair的更多相关文章

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

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

  2. poj 3691 DNA repair(AC自己主动机+dp)

    DNA repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5877   Accepted: 2760 Descri ...

  3. HDU 2457/POJ 3691 DNA repair AC自动机+DP

    DNA repair Problem Description   Biologists finally invent techniques of repairing DNA that contains ...

  4. POJ 3691 DNA repair (DP+字符串)

    题意:给出nn(1≤n≤50,1≤n≤50) 个病毒DNA序列,长度均不超过20.现在给出一个长度不超过1000的字符串,求至少要更换多少个字符, 才能使这个字符串不包含这些DNA序列. 析:利用前缀 ...

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

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

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

  7. POJ 3691 DNA repair ( Trie图 && DP )

    题意 : 给出 n 个病毒串,最后再给出一个主串,问你最少改变主串中的多少个单词才能使得主串中不包含任何一个病毒串 分析 : 做多了AC自动机的题,就会发现这些题有些都是很套路的题目.在构建 Trie ...

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

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

  9. 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: ...

随机推荐

  1. SharePoint 2013 配置我的网站 图文引导

    博客地址:http://blog.csdn.net/FoxDave 本篇我们来讲述一下关于SharePoint中我的网站(My Sites)相关的东西. 我的网站是SharePoint 2013中面向 ...

  2. Osmocom-BB MOTO C118硬刷

    写在最前面,先知我YY下硬刷最好可能实现的功能: 1.把软件刷入flash,修改loader后,可以实现上电就自动运行程序: 2.硬刷后,程序自动起来,可以修改loader就行加密 3.硬刷后,有可能 ...

  3. JS监听关闭浏览器事件

    Onunload与Onbeforeunload Onunload,onbeforeunload都是在刷新或关闭时调用,可以在<script>脚本中通过window.onunload来指定或 ...

  4. PHP实现简单计算器

    <!--简单的计算器--> <!DOCTYPE html> <html> <head> <title>PHP实现简单计算器</titl ...

  5. PHP_ArrayList

      <?php //遍历数组的2种方式 $arr=array( "1"=>"hello", "2"=>"my&q ...

  6. HtmlString类创建HTML Hepler 扩展MVC TextBox组件

    第一步:定义静态类 第二步:定义静态方法1 public static class MyTextBoxEx(){ //扩展方法三要素: //1.静态类 //2.静态方法 //3.this关键字 pub ...

  7. Selenium Waits

    Selenium高级功能包含查找等待, Selenium的查找等待有两种方式, 隐式等待(Implicit Waits)和显示等待(Explicit Waits): 这里写下我对两者的理解, 1. 隐 ...

  8. JavaScript string.format

    //string.format String.prototype.format=function(){ var e = this, f = arguments.length; if (f > 0 ...

  9. magento十大免费插件

    10. 自定义分层导航风格URL:http://www.magentocommerce.com/magento-connect/custom-layered-navigation-style.html ...

  10. Word embedding

    https://en.wikipedia.org/wiki/Word_embedding 简言之,就是讲词汇或短语映射成实值特征向量.