AC自动机+DP

#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;

#define D(x) 

;
;
;
;
const int MAX_NODE_NUM = MAX_N * MAX_D_LEN;
const int INF = 0x3f3f3f3f;

char dna[MAX_LEN];

struct Trie
{
    int next[MAX_NODE_NUM][MAX_CHILD_NUM];
    int fail[MAX_NODE_NUM];
    bool disease[MAX_NODE_NUM];
    int node_cnt;
    bool vis[MAX_NODE_NUM]; //set it to false
    int root;
    int dp[MAX_LEN][MAX_NODE_NUM];

    void init()
    {
        node_cnt = ;
        root = newnode();
        memset(vis, , sizeof(vis));
    }

    int newnode()
    {
        ; i < MAX_CHILD_NUM; i++)
            next[node_cnt][i] = -;
        disease[node_cnt++] = false;
        ;
    }

    int get_id(char a)
    {
        if (a == 'A')
            ;
        if (a == 'T')
            ;
        if (a == 'C')
            ;
        ;
    }

    void insert(char buf[])
    {
        int now = root;
        ; buf[i]; i++)
        {
            int id = get_id(buf[i]);
            )
                next[now][id] = newnode();
            now = next[now][id];
        }
        disease[now] = true;
    }

    void build()
    {
        queue<int>Q;
        fail[root] = root;
        ; i < MAX_CHILD_NUM; i++)
            )
                next[root][i] = root;
            else
            {
                fail[next[root][i]] = root;
                Q.push(next[root][i]);
            }
        while (!Q.empty())
        {
            int now = Q.front();
            Q.pop();
            ; i < MAX_CHILD_NUM; i++)
                )
                    next[now][i] = next[fail[now]][i];
                else
                {
                    fail[next[now][i]]=next[fail[now]][i];
                    if (disease[fail[next[now][i]]])
                        disease[next[now][i]] = true;
                    Q.push(next[now][i]);
                }
        }
    }

    int work()
    {
        scanf("%s", dna);
        int len = strlen(dna);
        ; i < node_cnt; i++)
        {
            if (disease[i])
                dp[len][i] = INF;
            else
                dp[len][i] = ;
        }
        ; i >= ; i--)
        {
            int key = get_id(dna[i]);
            ; j < node_cnt; j++)
            {
                dp[i][j] = INF;
                if (disease[j])
                    continue;
                ; k < ; k++)
                {
                    ;
                    if (k == key)
                        temp = ;
                    int v = next[j][k];
                    if (disease[v])
                        continue;
                    dp[i][j] = min(dp[i][j], temp + dp[i + ][v]);
                    D(printf(][next[j][k]]));
                }
                D(printf("dp[%d][%d]=%d\n", i, j, dp[i][j]));
            }
        }
        ][root];
    }

    void debug()
    {
        ;i < node_cnt;i++)
        {
            printf("id = %3d,fail = %3d,end = %3d,chi = [",i,fail[i],disease[i]);
            ;j < MAX_CHILD_NUM;j++)
                printf("%2d",next[i][j]);
            printf("]\n");
        }
    }
}ac;

int n;
char st[MAX_D_LEN];

int main()
{
    ;
    while (scanf("%d", &n), n)
    {
        ac.init();
        ; i < n; i++)
        {
            scanf("%s", st);
            ac.insert(st);
        }
        ac.build();
        int ans = ac.work();
        if (ans >= INF)
            ans = -;
        printf("Case %d: %d\n", case_num++, ans);
    }
    ;
}

hdu2457的更多相关文章

  1. hdu2457 Trie图+dp

    hdu2457 给定n个模式串, 和一个文本串 问如果修改最少的字符串使得文本串不包含模式串, 输出最少的次数,如果不能修改成功,则输出-1 dp[i][j] 表示长度为i的字符串, 到达状态j(Tr ...

  2. HDU2457 DNA repair —— AC自动机 + DP

    题目链接:https://vjudge.net/problem/HDU-2457 DNA repair Time Limit: 5000/2000 MS (Java/Others)    Memory ...

  3. HDU2457 DNA repair(AC自动机+DP)

    题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段. 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来. dp[i][j]表示原DNA前i位(在AC自动机上转移i步) ...

  4. hdu2457:DNA repair

    AC自动机+dp.问改变多少个字符能让目标串不含病毒串.即走过多少步不经过病毒串终点.又是同样的问题. #include<cstdio> #include<cstring> # ...

  5. [hdu2457]DNA repair(AC自动机+dp)

    题意:给出一些不合法的模式DNA串,给出一个原串,问最少需要修改多少个字符,使得原串中不包含非法串. 解题关键:多模式串匹配->AC自动机,求最优值->dp,注意在AC自动机上dp的套路. ...

  6. 【hdu2457】ac自动机 + dp

    传送门 题目大意: 给你一个字符主串和很多病毒串,要求更改最少的字符使得没有一个病毒串是主串的子串. 题解: ac自动机 + dp,用病毒串建好ac自动机,有毒的末尾flag置为true 构建fail ...

  7. POJ 1625 Censored!(AC自动机-&gt;指针版+DP+大数)题解

    题目:给你n个字母,p个模式串,要你写一个长度为m的串,要求这个串不能包含模式串,问你这样的串最多能写几个 思路:dp+AC自动机应该能看出来,万万没想到这题还要加大数...orz 状态转移方程dp[ ...

  8. Hnu 11187 Emoticons :-) (ac自己主动机+贪心)

    题目大意: 破坏文本串.使之没有没有出现表情.破坏就是用空格替换.问最少须要破坏多少个字符. 思路分析: 初看跟Hdu 2457 没什么差别,事实上Hdu2457是要求将字符替换成ACGT,而这个仅仅 ...

  9. 【AC自动机&amp;&amp;Trie图】积累

    以前KMP和后缀系列(主要是后缀数组,后缀自动机),都刷了一定数量的题,但是对于AC自动机,却有些冷落,罪过. 但是我感觉,在蓝桥杯比赛中AC自动机出现的概率比后缀系列大,简单的会考匹配,稍难一点会考 ...

随机推荐

  1. svn迁移到git

    步骤命令如下: > git svn clone https://svn-url/ProjectName --no-metadata --authors-file=user.txt --trunk ...

  2. iPad开发(Universal Applications)

    一.iPad 1.判断是否在iPad上 BOOL iPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdi ...

  3. 检测页面的localstorage剩余容量

    首先用了JSON.stringify(localStorage).length得出你当前页面的localstorage所使用的字符数量current_num. 然后你再去http://arty.nam ...

  4. js中this的四种使用方法

    0x00:js中this的四种调用模式 1,方法调用模式 2,函数调用模式 3,构造器调用模式 4,apply.call.bind调用模式 0x01:第一种:方法调用模式 (也就是用.调用的)this ...

  5. vue结构详解

    相关文件和文件夹的含义: build 文件夹: 里面是对 webpack 开发和打包的相关设置,包括入口文件.输出文件.使用的模块等:config 文件夹: 主要是指定开发和打包中的静态资源路径.要压 ...

  6. .NET垃圾回收机制(一)

    垃圾收集器(GarbageCollection)是组成.Net平台一个很重要的部分,.NET垃圾回收机制降低了编程复杂度,使程序员不必分散精力去处理析构.不妨碍设计师进行系统抽象.减少了由于内存运用不 ...

  7. 查找具有特定属性的元素 (XPath-LINQ to XML)

    XElement doc = XElement.Parse( @"<Root> <Child1>1</Child1> <Child2 Select= ...

  8. 关于Unity中定时器的简易使用

    定时器 一段指定的时间后执行某个函数或者某个语句 用法 //定时器写法1 flaot total_time; void Update(){ this.total_time += (Time.delta ...

  9. C# toolstrip 上添加DateTimePicker Control控件

    private void AddDTPtoToolstrip( n){DateTimePicker dtp = DateTimePicker;dtp.Width = 110;dtp.Format = ...

  10. PHP实现一个ip(如:127.0.0.1)和多个域名(虚拟主机)的绑定

    解决方案一:通过端口来区分不同的虚拟主机 ①按照绑定一个站点的方法做好准备 1. 先开发好自己的网站(d:/myblog(存放在D盘的myblog目录下)) 2. 配置httpd.conf文件(存放在 ...