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\n",ans); 30 } 31 return 0; 32 }