KMP板子

pi数组存储着以i位置为结尾的最长匹配真前后缀的长度

模式串:s2
主串:s1

str = s2 + "#" + s1

kmp算法能够快速找到模式串在主串中的位置(当pi的大小与模式串长度一致时,说明匹配。匹配位置:i-2*m(因为还要减去模式串在str中的长度))和数量!

时间复杂度O(n)

这个模板用于返回模式串s2在主串s1中的位置数组(s1以1做开头而非0)

vector<int>pi(maxn);
vector<int>kmp(string s1,string s2){
	vector<int>pos;
	string str=s2+"#"+s1;
	
	int m=s2.size();
	for(int i=1;i<str.size();i++){
		int len=pi[i-1];
		while(len!=0&&str[i]!=str[len]){
			len=pi[len-1];
		}
		if(str[i]==str[len]){
			pi[i]=len+1;
			if(pi[i]==m){
				pos.pb(i-2*m+1);
			}
		}
	}
	return pos;
}
posted @ 2025-03-09 09:56  Marinaco  阅读(30)  评论(0)    收藏  举报
//雪花飘落效果