剪花布条 HDU - 2087
翻译一下题目就是求主串里有多少个子串
数据很小,貌似暴力就能过.但写这道题主要是练习KMP
默写KMP模板,j回溯时不要ne[j]直接等于0即可
j = ne[j]是求重叠子串的本质
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 1000010; 4 char a[N],b[N]; 5 int ne[N]; 6 int main() 7 { 8 while(scanf("%s",a+1)!=EOF) 9 { 10 int alen = strlen(a+1); 11 if(alen==1&&a[1] == '#') break; 12 scanf("%s",b+1); 13 int blen = strlen(b+1),cnt = 0; 14 for(int i=2,j=0;i<=blen;i++){ 15 while(j&&b[i]!=b[j+1]) j = ne[j]; 16 if(b[i]==b[j+1]) j++; 17 ne[i] = j; 18 } 19 for(int i=1,j=0;i<=alen;i++){ 20 while(j&&a[i]!=b[j+1]) j = ne[j]; 21 if(a[i]==b[j+1]) j++; 22 if(j==blen) 23 { 24 cnt++; j = 0; 25 } 26 } 27 printf("%d\n",cnt); 28 } 29 return 0; 30 }