zoukankan      html  css  js  c++  java
  • Poj3691(AC自动机+DP(简单题))

    //#pragma comment(linker, "/STACK:102400000")
    #include<cstdlib>
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #include<set>
    #include<map>
    #include<list>
    #include<queue>
    #include<stack>
    #include<vector>
    #define tree int o,int l,int r
    #define lson o<<1,l,mid
    #define rson o<<1|1,mid+1,r
    #define lo o<<1
    #define ro o<<1|1
    #define pb push_back
    #define mp make_pair
    #define ULL unsigned long long
    #define LL long long
    #define inf 0x3fffffff//不要太大!溢出!
    #define eps 1e-7
    #define N 1009
    #define M 4
    #define mod 100000
    using namespace std;
    int m,n,T,t,x,y,u;
    int ch[N][4];
    int v[N];
    int f[N],last[N],num;
    char str[N];
    int d[N][N];
    void clear()//Trie树初始化
    {
        memset(d,-1,sizeof(d));
        num=1;
        memset(ch[0],0,sizeof(ch[0]));
        memset(v,0,sizeof(v));
        memset(last,0,sizeof(last));
    }
    int idx(char c)
    {
        switch(c)
        {
        case 'A':
            return 0;
        case 'C':
            return 1;
        case 'G':
            return 2;
        case 'T':
            return 3;
        }
        return 0;
    }
    void insert(char str[],int value)//建Trie树
    {
        int len=strlen(str);
        int u=0;
        for (int i=0; i<len; ++i )
        {
            int c=idx(str[i]);
            if(!ch[u][c])//保存的是结点坐标
            {
                memset(ch[num],0,sizeof(ch[num]));
                ch[u][c]=num++;//
            }
            u=ch[u][c];
        }
        v[u]=value;
    }
    void getac()
    {
        queue<int> q;//保存的节点下标
        f[0]=0;
        for (int c=0; c<M; ++c )
        {
            int u=ch[0][c];
            if(u)//不需要优化的else
            {
                q.push(u);
                f[u]=0;
                last[u]=v[u];//WA,可能有长度为1的串
            }
        }
        while(!q.empty())
        {
            int r=q.front();
            q.pop();
            for (int c=0; c<M; ++c )
            {
                int u=ch[r][c];
                if(u)
                {
                    q.push(u);
                    int s=f[r];
                    f[u]=ch[s][c];
                    last[u]=(v[u]||last[f[u]]);//改
                }
                else //重要优化
                    ch[r][c]=ch[f[r]][c];
            }
        }
    }
    int dp(int u,int k)
    {
        if(k==n)return 0;
        int &ans=d[u][k];
        if(ans!=-1)return ans;
        ans=inf;
        for(int i=0; i<4; i++)
        {
            int c=ch[u][i];
            if(last[c]==0)
            {
                ans=min(ans,dp(c,k+1)+(idx(str[k])!=i?1:0));
            }
        }
        return ans;
    }
    int main()
    {
    #ifndef ONLINE_JUDGE
        freopen("ex.in","r",stdin);
    #endif
        int ncase=0;
    //    scanf("%d",&T);
    //    while(T--)
        while(scanf("%d",&m)==1&&m)
        {
            clear();
            while(m--)
            {
                scanf("%s",str);
                insert(str,1);
            }
            getac();
            scanf("%s",str);
            n=strlen(str);
            printf("Case %d: %d
    ",++ncase,dp(0,0)==inf?-1:dp(0,0));
        }
        return 0;
    }
    

      

  • 相关阅读:
    Lucky Substrings
    KMP
    圆桌问题(hdu4841)
    codeforces 624C Graph and String
    Joseph(hdu1443)
    The Longest Straight(FZUoj2216)
    C1. 组队活动 Small(BNUOJ)
    A1. 道路修建 Small(BNUOJ)
    Problem 2221 RunningMan(fuzoj)
    CODEFORCEs 621E. Wet Shark and Blocks
  • 原文地址:https://www.cnblogs.com/sbaof/p/3373765.html
Copyright © 2011-2022 走看看