void preKmp(char *src, int m, int *rule){ int i=0,j=-1; rule[0]=j; while(i<m){ while(j!=-1 && src[j] != src[i]) j=rule[j]; i++,j++; if(j>=m) rule[i]=rule[j-1]; else rule[i]=j; } } void kmp(char *src, int m, char *dest, int n) { int rule[10005]; preKmp(src,m,rule); int i=0, j=0; while(i<n){ while(j!=-1 && src[j] != dest[i]){ j = rule[j]; } i++,j++; if(j==m){ //printf("%d/n",i-m); 匹配位置 //recount++; 匹配计数 j=rule[j]; } } } POJ3461完整代码 #include <stdio.h> #include <string.h> void preKmp(char *src, int m, int *rule){ int i=0,j=-1; rule[0]=j; while(i<m){ while(j!=-1 && src[j] != src[i]) j=rule[j]; i++,j++; if(j>=m) rule[i]=rule[j-1]; else rule[i]=j; } } int recount=0; void kmp(char *src, int m, char *dest, int n) { int rule[10005]; preKmp(src,m,rule); int i=0, j=0; while(i<n){ while(j!=-1 && src[j] != dest[i]){ j = rule[j]; } i++,j++; if(j==m){ //printf("%d/n",i-m); //recount++; j=rule[j]; } } } char Reg[10005],ori[1000005]; int main() { int t; //freopen("E://input.txt","r",stdin); scanf("%d",&t); while (t--) { recount=0; scanf("%s%s",&Reg,&ori); kmp(Reg,strlen(Reg),ori,strlen(ori)); printf("%d/n",recount); } return 0; }