KMP 自動機
定義狀態 \(\texttt{nxt}_{i,j}\) 表示在 \(i\) 接一個字元 \(j\) 的最終匹配位置。
轉移是顯然的。
\(\texttt{nxt}_{i,j}=\texttt{nxt}_{fail_i,j}\)
注意 KMP 的字符集無關的,而 KMP 自動機依賴字符集大小。
struct Auto{
char s[N];
int n,nxt[N][26];
void init()
{
n=strlen(s+1);
int fail=0;
for(int i=1;i<=n;i++)
{
int c=s[i]-'a';
fail=nxt[fail][c];
nxt[i-1][c]=i;
for(int j=0;j<26;j++)
nxt[i][j]=nxt[fail][j];
}
}
}