POJ 3691 DNA repair【AC自动机+DP】

只能说这道题目的数据好强啊,以前写的自动机都是有缺陷的但是可以过题,这次被坑大发了……呜呜

f(i, j)表示长度为i的串,到j状态时需要更改的次数。

f(i, u)  =  min(f(i, u), f(i-1, j) + (s[i] != k))

u是状态j的子状态。


#include 
#include 
#include 
#include 
using namespace std;
struct AC_Automata {
    #define N 1003
    #define M 4
    int ch[N][M], val[N], last[N], f[N], sz;
    void clear() { sz = 1; memset(ch[0], 0, sizeof(ch[0])); }
    int idx(char c) {
        if (c == 'A') return 0;
        if (c == 'G') return 1;
        if (c == 'C') return 2;
        return 3;
    }

    void insert(char s[], int v) {
        int u = 0;
        for (int i=0; s[i]; i++) {
            int c = idx(s[i]);
            if (!ch[u][c]) {
                memset(ch[sz], 0, sizeof(ch[sz]));
                val[sz] = 0;
                ch[u][c] = sz++;
            }
            u = ch[u][c];
        }
        val[u] = 1;
    }
    void build() {
        queue q;
        f[0] = 0;
        for (int c=0; c= inf) continue;
            for (int k=0; k<4; k++) {
                u = ac.ch[j][k];
                if (ac.val[u]) continue;
                if (ac.idx(s[i-1]) == k) t = 0;
                else t = 1;
                f[i][u] = min(f[i][u], f[i-1][j]+t);
            }
        }
    }
    int ans = inf;
    for (int i=0; i


你可能感兴趣的:(ACM,数据结构,字符串匹配)