—————————————————————————————————————————————————— —————————————————————前排护眼——————————————————————— ——————————————————————————————————————————————————
//文本串和模式串
string str,pat;
//next[i]表示模式串前i个字符组成的串其前缀后缀相通的最长长度
//也是在i出匹配失败时该跳转的位置
int next[10002];
//得到next数组
void getnext(){
int i=0,j=-1;
next[0]=-1;
while(i<pat.size()){
if(j==-1||pat[i]==pat[j]){
next[++i]=++j;
}
else j=next[j];
}
}
//返回文本串中模式串出现的次数
int kmp(){
int i=0,j=0,len1=str.size(),len2=pat.size();
int ans=0;
while(i<len1){
if(j==-1||str[i]==pat[j]){
i++;
j++;
}
else j=next[j];
if(j==len2)ans++;
}
return ans;
}