dp[i][j] 它表示的长度 i 下游前缀 j 更改节点的最小数量。
很清楚dp[0][0] = 0;
dp[ i ][ j ] = min(dp[ i ][ j ],dp[i-1][k] + (j == k ?
0 : 1)),当且仅当j。k满足下列条件时。
j 不为某条模式串的末节点 且 j 到 root 的由失败指针组成的路径上无末节点。
j 是k的儿子节点 或者 j 的父节点可由 k 沿着失败指针找到。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#pragma comment(linker, "/STACK:1024000000");
#define EPS (1e-8)
#define LL long long
#define ULL unsigned long long
#define _LL __int64
#define INF 0x3f3f3f3f
using namespace std;
const int MAXN = 4;
struct N
{
int next[MAXN],flag,fail;
} st[1010];
int Top;
int sel(char c)
{
if(c == 'A')
return 0;
if(c == 'G')
return 1;
if(c == 'C')
return 2;
return 3;
}
int creat()
{
memset(st[Top].next,-1,sizeof(st[Top].next));
st[Top].fail = -1,st[Top].flag = 0;
return Top++;
}
int dp[1010][1010];
char s[1010];
void Get_Trie(int root,char *s)
{
int site = 1;
while(s[site] != '