剪花布条 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 } 

 

posted @ 2020-12-30 23:42  acmloser  阅读(74)  评论(0编辑  收藏  举报