两个kmp hdu 2594 & hdu 2087
#include <stdio.h> #include <string.h> char a[110000],b[110000]; int p[110000]; int main() { int i,j; int y; while(scanf("%s",b+1)!=EOF) { int len=strlen(b+1); b[len+1]='X'; b[len+2]='\0'; y=strlen(b+1); //printf("%d %d\n",len,y); scanf("%s",a+1); strcat(b+1,a+1); y=strlen(b+1); j=0; p[1]=0; for(i=2;i<=y;i++) { while(j>0&&b[i]!=b[j+1]) j=p[j]; if(b[i]==b[j+1]) j++; p[i]=j; } if(p[y]!=0) { for(i=1;i<=p[y];i++) printf("%c",b[i]); printf(" "); } printf("%d\n",p[y]); } return 0; }
#include <stdio.h> #include <string.h> char a[2000],b[2000]; int p[2000]; int main() { int i,j; while(1) { scanf("%s",a+1); if(a[1]=='#') break; scanf("%s",b+1); //puts(b+1); int x=strlen(a+1); int y=strlen(b+1); int sum=0; j=0; p[1]=0; for(i=2;i<=y;i++) { while(j>0&&b[i]!=b[j+1]) j=p[j]; if(b[i]==b[j+1]) j++; p[i]=j; } j=0; for(i=1;i<=x;i++) { while(j>0&&b[j+1]!=a[i]) j=p[j]; if(b[j+1]==a[i]) j++; if(j==y) { sum++; j=0; } } printf("%d\n",sum); } return 0; }