• hdu 2457(ac自动机+dp)


    题意:容易理解...

    分析:这是一道比较简单的ac自动机+dp的题了,直接上代码。

    代码实现:

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<iostream>
    #include<queue>
    using namespace std;
    struct node{
        int next[4];
        int fail;
        int flag;
        void init()
        {
            memset(next,0,sizeof(next));
            fail=0;
            flag=0;
        }
    }a[1005];
    char keyword[25];
    char S[1005];
    int tot,len;
    int dp[1005][1005];
    
    int Min(int a,int b)
    {
        return a<b?a:b;
    }
    
    void chushihua()
    {
        int i,j;
        tot=0;
        a[0].init();
        for(i=0;i<1005;i++)
           for(j=0;j<1005;j++)
             dp[i][j]=1000000;
        dp[0][0]=0;
    }
    
    int hash(char x)
    {
        if(x=='A')
         return 0;
        else if(x=='C')
         return 1;
        else if(x=='G')
         return 2;
        else
         return 3;
    }
    
    void insert(char *str)
    {
        int index,p=0;
        for(;*str!='';str++)
        {
            index=hash(*str);
            if(a[p].next[index]==0)
            {
                a[++tot].init();
                a[p].next[index]=tot;
            }
            p=a[p].next[index];
        }
        a[p].flag=1;
    }
    
    void build_fail()
    {
        queue<int>Q;
        int p,cur,son,i;
        Q.push(0);
        while(!Q.empty())
        {
            p=Q.front();
            Q.pop();
            for(i=0;i<4;i++)
            {
                if(a[p].next[i]!=0)
                {
                    son=a[p].next[i];
                    cur=a[p].fail;
                    if(p==0)
                        a[son].fail=0;
                    else
                    {
                        while(cur&&a[cur].next[i]==0)
                        cur=a[cur].fail;
                        a[son].fail=a[cur].next[i];
                    }
                    if(a[a[son].fail].flag==1)
                        a[son].flag=1;
                    if(a[son].flag==0)
                        Q.push(son);
                }
                else
                    a[p].next[i]=a[a[p].fail].next[i];
            }
        }
    }
    
    void solve(int t)
    {
        int i,j,k,son,res=1000000;
        char x;
        for(i=1;i<=len;i++)
        {
            for(j=0;j<=tot;j++)
            {
                if(dp[i-1][j]==1000000||a[j].flag==1)
                  continue;
                for(k=0;k<4;k++)
                {
                    son=a[j].next[k];
                    if(a[son].flag==1)
                        continue;
                    if(k==0)
                      x='A';
                    else if(k==1)
                      x='C';
                    else if(k==2)
                      x='G';
                    else
                      x='T';
                    if(x==S[i-1])
                    {
                        if(dp[i][son]==1000000)
                           dp[i][son]=dp[i-1][j];
                        else
                           dp[i][son]=Min(dp[i][son],dp[i-1][j]);
                    }
                    else
                    {
                        if(dp[i][son]==1000000)
                           dp[i][son]=dp[i-1][j]+1;
                        else
                           dp[i][son]=Min(dp[i][son],dp[i-1][j]+1);
                    }
                }
            }
        }
        for(i=0;i<=tot;i++)
            if(dp[len][i]<res)
              res=dp[len][i];
        printf("Case %d: ",t);
        if(res==1000000)
            printf("%d
    ",-1);
        else
            printf("%d
    ",res);
    }
    
    int main()
    {
        int n,t=0;
        while(scanf("%d",&n)!=EOF&&n)
        {
            t++;
            chushihua();
            getchar();
            while(n--)
            {
                scanf("%s",keyword);
                insert(keyword);
            }
            build_fail();
            scanf("%s",S);
            len=strlen(S);
            solve(t);
        }
        return 0;
    }
  • 相关阅读:
    python列表转json树菜单
    lvm分区创建和扩容
    分布式网络概述
    mycat权威指南阅读笔记--序言1
    Mongodb副本集实现及读写分离
    线程和进程
    socket客户端怎么判断http响应数据的结束
    java遍历http请求request的所有参数实现方法
    Java中mongodb使用and和or的复合查询
    idea @Override is not allowed when implementing interface method
  • 原文地址:https://www.cnblogs.com/jiangjing/p/3237933.html
Copyright © 2020-2023  润新知