目的是找到模板串在文本串中的位置:
//模板
const int N=1e4+10;
int nex[N];
char s[N];//这块必须用字符串数组来确保cin>>s+1是正确的;
int main(){
cin>>s+1;//确保输入的字符串下标为1
int n=strlen(s+1);
for(int i=2,j=0;i<=n;i++){
while(j&&s[i]!=s[j+1])j=nex[i];//失配
if(s[i]==s[j+1])j++;
nex[i]=j;
}
//nex数组初始化
for(int i=1,j=0;i<=n;i++){
while(j&&s[i]!=p[j+1])j=nex[j];
if(s[i]==p[j+1])j++;
if(j==m)ans++;
}//kpm算法 本质就是操作数组下标
cout<<ans;//即可输出子字符串出现的次数
相当于把字符串先求一次最长公共前后缀之和 之后再将模式串和其进行匹配;
在做题时 kmp算法还可以用于计算由相同的子字符串组成的字符串的组成数。因为nex数组计算到最后的时候的最长公共前后缀的长度就是字符串长度-子字符串长度;
在做题时,还另外学到:memset使用方式:只能初始化为-1或0;感谢