zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    终于合一起了...
    关于Earley第二篇论文给的建立parse tree的算法的bug
    不作恶
    windows server安装ATI显卡驱动
    不作恶:这次我是一个坚定的五毛党
    看了老刘的文章
    webkit svg高斯模糊的bug
    世界不平坦
    我发现我对人类活动的认识开始有一点点变化了
    css parsing中词法的RegEx(python)
  • 原文地址:https://www.cnblogs.com/jiangjing/p/3237933.html
Copyright © 2011-2022 走看看