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;
}