nyoj-5-kmp裸题

题目链接:

http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=5

kmp统计匹配串出现次数,贼尴尬好久没做字符串题目,一开始求得是文本串的next数组,后来才迷糊过来= =

求出next数组(这个数组写法很多,正常的是保存失配后的指针去向,有时候我也会保存最长公共前缀后缀长度,,,加上有时候字符串从0/1开始,很乱)

遍历文本串统计出现次数,当一个匹配完成之后执行  j=next[j-1]; 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     char a[15],b[1005];
 6     int n,i,j,k;
 7     int next[1005];
 8     cin>>n;
 9     while(n--){
10         int ans=0;
11         scanf("%s%s",a,b);
12         int la=strlen(a);
13         int lb=strlen(b);
14         next[0]=0;
15         next[1]=0;
16         for(i=2;i<la;++i)
17         {
18             j=next[i-1];
19             while(j&&a[j]!=a[i-1]) j=next[j];
20             next[i]=a[i-1]==a[j]?j+1:0;
21         }
22         j=0;
23         for(i=0;i<lb;++i)
24         {
25             while(j&&a[j]!=b[i]) j=next[j];
26             if(a[j]==b[i]) j++;
27             if(j==la){ans++;j=next[j-1];i--;}
28         }
29         printf("%d
",ans);
30     }
31     return 0;
32 }
原文地址:https://www.cnblogs.com/zzqc/p/8393738.html