给定字符串s,试找出其最小真前缀s0,
使得s可表示为若干s0的拼接,或判断不存在这样的s0。
设s的长度为n,s[i]的失配函数为π[i]。
结论:
- n−π[n]∣n则有s0=s[1][n−π[n]]
- n−π[n]∤n则s0不存在
证明:
若s0=s[1][k]其中k<n−π[n]
则有s[1][n−k]=s[k+1][n]
此时π′[n]=n−k>π[n]矛盾
若s0=s[1][k]其中k=n−π[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]
而s0=s[1][k],所以s可表示为若干s0的拼接
若s0=s[1][k]其中k>n−π[n]
因为k>n−π[n]所以此时s0不是最短的,矛盾
综上,当n−π[n]∣n时s0=s[1][n−π[n]]
若π[n]<n−π[n]且s0存在
因为s至少为2个s0的拼接,所以n−π[n]≤n/2
与假设矛盾。
若π[n]≥n−π[n]且s0存在,s0=s[1][k]
显然k≥n−π[n]否则π′[n]=n−k>π[n]矛盾
又n−π[n]∤n所以k=n−π[n]
即k>n−π[n]
设w=n−π[n]
可得$s_0=s[1][k]=s[w+1][w+k]=s[n-k+1][n]=s[n-w-k+1][n-w]$
因为k>w,所以s[1][k]和s[w+1][w+k]相交,s[n−k+1][n]和s[n−w−k+1][n−w]相交
所以s0[w+1][k]=s0[1][k−w]且s0[w+1][k]=s0[1][w]
w∣k时由上式可得s0能由若干s0[1][w]拼接而成,矛盾
w∤k时设l0=k%w
由上式可得s0[1][l0]=s0[l0+1][2l0]=s0[2l0+1][3l0]=...
若l0∣k则s0能由若干s0[1][l0]拼接而成,矛盾
若l0∤k设l1=k%l0有s0[1][l1]=s0[l1+1][2l1]=s0[2l1+1][3l1]=...
重复操作,由于序列l持续减少,必存在lx∣k,故s0能由若干s0[1][lx]拼接而成,矛盾
综上,当n−π[n]∤n时不存在s0
证毕。