好久没刷 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. 开始接触BT5-自动登录X界面

    第一种,直接登录root用户的图形界面,不用输入密码 1,安装rungetty 1 # apt-get install rungetty 2,编辑/etc/init/tty1.conf root@bt ...

  2. C#基础--面向过程计算器

    //面向过程计算器 //思路: 需要注意的是: 两个数相除 除数不能为0: //1.提示用户输入 //2.进行运算 //3.得到结果 Console.WriteLine("请输入第一个数字: ...

  3. Python学习路程day6

    shelve 模块 shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式 import shelve d = shelve.open ...

  4. php大力力 [028节] 如何下载js文件,网上一个*.js无法下载啊??????

    php大力力 [028节] 如何下载js文件,网上一个*.js无法下载啊?????? safari也无法下载 迅雷也无法下载 是不是对方网站服务器的不让下载那个js目录的文件??? 只能调用js函数啊 ...

  5. 在windows下安装GIT

    Git是一个免费的.开源的版本控制软件.在Windows上安装git,一般为msysgit,官方下载地址为:http://code.google.com/p/msysgit/downloads/lis ...

  6. Unity3D ShaderLab 使用alpha参数创建透明效果

    Unity3D ShaderLab 使用alpha参数创建透明效果 其实Unity为了方便我们的工作,为我们内置了很多参数.比如马上用到的透明功能. 准备场景新建Shader Material ,一张 ...

  7. magento设置订单状态

    <?php require_once('app/Mage.php');umask(0);Mage::app('default'); $order = Mage::getModel('sales/ ...

  8. PHP 转换snmp的时间格式

    function convert_snmp_timeticks($timeticks) { if(!is_numeric($timeticks)) { return FALSE; } //如果是字符串 ...

  9. c++ 字符窜切割

    std::vector<std::string> Tools::SplitStr(const char* baseStr, const char* rule) { log("ba ...

  10. OpenvSwitch架构

    Openvswitch的架构 数据库结构和OVS-VSCTL # ps aux | grep openvswitch root      1117  0.0  0.0  21200  1580 ?   ...