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

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

设ss的长度为nn,s[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 n则s0s_0不存在

证明:


  • 对于情况1.

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

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

此时π′[n]=n−k>π[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][n−k]=s[k+1][n]s[1][n-k]=s[k+1][n]于是

s[1][k]=s[k+1][2k]=s[2k+1][3k]=...=s[n−2k+1][n−k]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 n时s0=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]

显然k≥n−π[n]k \ge n-\pi[n]否则π′[n]=n−k>π[n]\pi'[n]=n-k>\pi[n]矛盾

又n−π[n]∤nn-\pi[n] \nmid n所以k≠n−π[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[n−k+1][n]s[n-k+1][n]和s[n−w−k+1][n−w]s[n-w-k+1][n-w]相交

所以s0[w+1][k]=s0[1][k−w]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]

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

w∤kw \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]=...

若l0∣kl_0 \mid k则s0s_0能由若干s0[1][l0]s_0[1][l_0]拼接而成,矛盾

若l0∤kl_0 \nmid k设l1=k%l0l_1=k\%l_0有s0[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持续减少,必存在lx∣kl_x \mid k,故s0s_0能由若干s0[1][lx]s_0[1][l_x]拼接而成,矛盾


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


证毕。