题目网址:https://hihocoder.com/problemset/problem/1015
对于这个题,我写的时候有点就是数组开小了,导致运行错误。
#include<stdio.h> #include<string.h> int next[10010]={-1}; void next1(char s[],int len){ int j=-1; next[0]=-1; for(int i=1;i<len;i++){ while(j!=-1&&s[i]!=s[j+1]){ j=next[j];//如果不相等的话,就不断返回j=next【j】 } if(s[i]==s[j+1]){//如果相等的话 ,就是next【i】=j+1; j++; } if(j==-1||s[i+1]!=s[j+1]){ next[i]=j; } else{ next[i]=next[j]; } } } int kmp(char a[],char b[]){ int j=-1,ans=0; int n=strlen(a),m=strlen(b); next1(b,m); for(int i=0;i<n;i++){ while(j!=-1&&a[i]!=b[j+1]){ j=next[j]; } if(a[i]==b[j+1]){ j++; } if(j==m-1){ ans++; j=next[j]; } } return ans; } int main(){ int mm; scanf("%d",&mm); // getchar(); char a[1000010],b[10010]; while(mm--){ scanf("%s%s",b,a); printf("%d\n",kmp(a,b)); for(int i=0;i<strlen(b);i++){ next[i]=-1; } } }