#include<cstdio> #include<cstring> const int MAXN = 10000 + 10; void KMP(char *pattern, char *source, int *f){ //getfail int m = strlen(pattern) ,j; f[0] = f[1] = 0; for(int i = 1; i < m; ++i){ j = f[i]; while(j && pattern[i] != pattern[j]) j = f[j]; f[i+1] = (pattern[i] == pattern[j] ? j + 1 : 0); } //run int n = strlen(source); j = 0; for(int i = 0; i < n; ++i){ while(j && source[i] != pattern[j]) j = f[j]; if(source[i] == pattern[j]) ++j; if(j == m) printf("Find at %d\n",i-m+1); } //print F for(int i=0;i<m;++i){ if(i==0)printf("%d",f[i]); else printf(" %d", f[i]); } } void fcgets(char *data, int n){ fgets(data, n, stdin); char *find = strchr(data, '\n'); if(find) *find = '\0'; } char s[MAXN], s2[MAXN]; int f[MAXN]; int main(){ freopen("KMP.in", "r" ,stdin); fcgets(s, MAXN); fcgets(s2, MAXN); KMP(s2, s, f); return 0; }