// pku 1961.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "string.h" #include <iostream> using namespace std; const int maxn=1000005; char a[maxn]; char b[maxn]; int c[maxn]; void Cal_Next(char str[],int next[],int str_len) { next[0]=-1;//next[i]=j,表示 str[0..j]=str[i-j..i] int j=next[0]; for(int i=1;i<str_len;i++) { while(j>=0&&str[i]!=str[j+1]) j=next[j]; if(str[i]==str[j+1]) j++; next[i]=j; } } void STR_Find_KMP(char main_str[],char sub_str[],int next[]) { int main_len=strlen(main_str); int sub_len=strlen(sub_str); Cal_Next(sub_str,next,sub_len); int j=next[0]; for(int i=0;i<main_len;i++) { while(j>=0&&main_str[i]!=sub_str[j+1]) j=next[j]; if(main_str[i]==sub_str[j+1]) j++; if(j==sub_len-1) { printf("occur:%d/n",i-sub_len+1); j=next[j]; } } } int main() { while(scanf("%s%s",a,b)) { STR_Find_KMP(a,b,c); } return 0; }