KMP模板
Posted Kannyi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KMP模板相关的知识,希望对你有一定的参考价值。
提要
① 字符串是从0开始的
② next数组是从1开始的
#include<bits/stdc++.h> using namespace std; const int M=1000005; char s[M],t[M]; int next[M],slen,tlen; void getNext() { int i=0,j=-1; next[0]=-1; while(i<tlen) { if(j==-1||t[i]==t[j]) next[++i]=++j; else j=next[j]; } } //返回模式串t在主串s中首次出现的位置 //返回的位置是从0开始的 int Index() { int i=0,j=0; getNext(); while(i<slen&&j<tlen) { if(j==-1||s[i]==t[j]) i++,j++; else j=next[j]; } if(j==tlen) return i-tlen; else return -1; } //返回模式串t在主串s中出现的次数 int Count() { int i=0,j=0,ans=0; if(slen==1&&tlen==1) { if(s[0]==t[0]) return 1; else return 0; } getNext(); for(i=0;i<slen;i++) { while(j>0&&s[i]!=t[j]) j=next[j]; if(s[i]==t[j]) j++; if(j==tlen) { ans++; j=next[j]; } } return ans; } int main() { while(cin>>s>>t) { slen=strlen(s); tlen=strlen(t); cout<<"模式串t在主串s中首次出现的位置是:"<<Index()<<endl; cout<<"模式串t在主串s中出现的次数:"<<Count()<<endl; } return 0; }
以上是关于KMP模板的主要内容,如果未能解决你的问题,请参考以下文章