字符串的Period(周期),Border


字符串的Period(周期),Border

前置知識:\(\text{kmp}\)\(\text{AC}\)自動機

約定:字符串\(S\)的長度為\(|S|\),原串的長度為\(n\)\([l,r]\)的子串為\(S_{l,r}\),下標從\(1\)開始,前綴\(S_{1,i}=pre_i\),后綴\(S_{i,n}=suf_i\),設\(S\)\(\text{Border}\)集合為\(B(S)\),設最長的\(\text{Border}\)\(\text{LBorder}\)

\(\text{Border}\):

定義字符串\(S\)的一個\(\text{Border}\)為一個滿足\(pre_i=suf_{n-i+1}\)的前綴,\(S\)\(\empty\)也是一個\(\text{Border}\)

\(\text{kmp,AC}\)自動機的\(fail\)指針均指向當前串的\(\text{LBorder}\)

\[\ \]

\(\text{Period}\)(周期):

\(\exists |T|\in B(S), 2|T|\ge n\),則\(S\)的一個周期是\(n-|T|+1\)

\(\text{Periodicity Lemma}:\)

\(p,q\)\(S\)的周期,且\(p+q+\gcd(p,q)\leq |S|\),則\(\gcd(p,q)\)也是\(|S|\)的一個周期

證明的話

\[\ \]

關於\(\text{Border}\)的推論:

1.\(B(S)=B(\text{LBorder})\cup\{S\}\)

2.串\(S\)的所有\(\text{Border}\)長度構成了不超過\(\log n\)個等差數列

證明:

如果\(S\)\(\text{LBorder}\),設其為\(T\)滿足\(2|T|\ge |S|\),則所有\(R\in B(S),2|R|\ge |S|\)形成了一個等差數列

參過下面這張圖

aZ5SUJ.png

則長度為\(|T|-(|S|-|T|)\),即標為紅色的那一段,它也是原串的一個\(\text{Border}\)

更簡潔的解釋是,\(S\)有着長度為\(|S|-|T|\)的周期

所以實際上不止是\(2|R|\ge |S|\)的串,而是所有\(\forall|R|\equiv |S|\pmod {|S|-|T|}\)\(R\)都是\(S\)\(\text{Border}\)

這樣的失配過程就可以歸納為:

每次\(mod\)最短周期\(|T|-|S|\),而取模使得長度至少減半,故可以分成\(\log n\)段等差數列

\[\ \]

並且任意一段最大項為\(x\),差為\(d\)的等差數列,最小項是\(x\mod d+d\)

(\(+d\)是因為在\(x\mod d+d\)下一次可能跳的位置\(>x\mod d\))

應用:對於\(\text{kmp,AC}\)自動機的字符集過大導致無法存儲每種字符的轉移,而又有類似可持久化的匹配操作時,

直接暴力跳\(fail\)會導致復雜度退化,但是可以用等差數列的性質來快速跳

每次形成等差數列時,周期中失配位置的下一個字符都相同

故如果在等差數列上失配,可以直接通過對於差值取模快速跳過,以保證復雜度為\(O(\log n)\)

相比於倍增處理,這樣跳常數小,實現簡單

具體看下面的習題代碼

練習模板: Luogu P5829 求公共\(\text{Border}\)

#include<bits/stdc++.h>
using namespace std;
enum{N=1000010};
char s[N];
int _,i,j,nxt[N];
int main(){
	for(scanf("%s",s+1),i=2;s[i];++i){
		while(j && s[i]!=s[j+1]) j=nxt[j];
		if(s[i]==s[j+1]) j++;
		nxt[i]=j;
	}
	for(scanf("%d",&_);_--;){
		for(scanf("%d%d",&i,&j),i=nxt[i],j=nxt[j];i!=j;){
			if(i<j) swap(i,j);
			if(nxt[i]>i/2) {
                // 產生等差數列,快速跳過
				int d=i-nxt[i];
				if(j%d==i%d) i=j;
				else i=i%d+d;
			} else i=nxt[i];
		}
		printf("%d\n",i);
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM