给定字符串ss,试找出其最小真前缀s0s_0

使得ss可表示为若干s0s_0的拼接,或判断不存在这样的s0s_0

ss的长度为nns[i]s[i]的失配函数为π[i]\pi[i]

结论:

  1. nπ[n]nn-\pi[n] \mid n则有s0=s[1][nπ[n]]s_0=s[1][n-\pi[n]]
  2. nπ[n]nn-\pi[n] \nmid ns0s_0不存在

证明:


  • 对于情况1.

s0=s[1][k]s_0=s[1][k]其中k<nπ[n]k<n-\pi[n]

则有s[1][nk]=s[k+1][n]s[1][n-k]=s[k+1][n]

此时π[n]=nk>π[n]\pi'[n]=n-k>\pi[n]矛盾


s0=s[1][k]s_0=s[1][k]其中k=nπ[n]k=n-\pi[n]

则有s[1][nk]=s[k+1][n]s[1][n-k]=s[k+1][n]于是

s[1][k]=s[k+1][2k]=s[2k+1][3k]=...=s[n2k+1][nk]s[1][k]=s[k+1][2k]=s[2k+1][3k]=...=s[n-2k+1][n-k]

s0=s[1][k]s_0=s[1][k],所以ss可表示为若干s0s_0的拼接


s0=s[1][k]s_0=s[1][k]其中k>nπ[n]k>n-\pi[n]

因为k>nπ[n]k>n-\pi[n]所以此时s0s_0不是最短的,矛盾


综上,当nπ[n]nn-\pi[n] \mid ns0=s[1][nπ[n]]s_0=s[1][n-\pi[n]]


  • 对于情况2.

π[n]<nπ[n]\pi[n]<n-\pi[n]s0s_0存在

因为ss至少为2个s0s_0的拼接,所以nπ[n]n/2n-\pi[n] \le n/2

与假设矛盾。


π[n]nπ[n]\pi[n] \ge n-\pi[n]s0s_0存在,s0=s[1][k]s_0=s[1][k]

显然knπ[n]k \ge n-\pi[n]否则π[n]=nk>π[n]\pi'[n]=n-k>\pi[n]矛盾

nπ[n]nn-\pi[n] \nmid n所以knπ[n]k \ne n-\pi[n]

k>nπ[n]k > n-\pi[n]

w=nπ[n]w=n-\pi[n]

可得$s_0=s[1][k]=s[w+1][w+k]=s[n-k+1][n]=s[n-w-k+1][n-w]$

因为k>wk > w,所以s[1][k]s[1][k]s[w+1][w+k]s[w+1][w+k]相交,s[nk+1][n]s[n-k+1][n]s[nwk+1][nw]s[n-w-k+1][n-w]相交

所以s0[w+1][k]=s0[1][kw]s_0[w+1][k]=s_0[1][k-w]s0[w+1][k]=s0[1][w]s_0[w+1][k]=s_0[1][w]

wkw \mid k时由上式可得s0s_0能由若干s0[1][w]s_0[1][w]拼接而成,矛盾

wkw \nmid k时设l0=k%wl_0=k\%w

由上式可得s0[1][l0]=s0[l0+1][2l0]=s0[2l0+1][3l0]=...s_0[1][l_0]=s_0[l_0+1][2l_0]=s_0[2l_0+1][3l_0]=...

l0kl_0 \mid ks0s_0能由若干s0[1][l0]s_0[1][l_0]拼接而成,矛盾

l0kl_0 \nmid kl1=k%l0l_1=k\%l_0s0[1][l1]=s0[l1+1][2l1]=s0[2l1+1][3l1]=...s_0[1][l_1]=s_0[l_1+1][2l_1]=s_0[2l_1+1][3l_1]=...

重复操作,由于序列ll持续减少,必存在lxkl_x \mid k,故s0s_0能由若干s0[1][lx]s_0[1][l_x]拼接而成,矛盾


综上,当nπ[n]nn-\pi[n] \nmid n时不存在s0s_0


证毕。