坑的kmp 最后写成这样了~~
当 next[n]=0时 就是这道题的答案了。
但是 当不加上文一句时记录的是 每次kmp时的起始位置。
#include<stdio.h>
#include<vector>
#include<string>
#include<iostream>
using namespace std;
vector<int> ans;
vector<int> get_SubString(string pattern,string text){
int n=pattern.size();
vector<int> next(n+1,0);
for (int i = 1;i < n;i++){
int j = i;
while(j>0){
j=next[j];
if(pattern[i] == pattern[j] ){
next[i+1]=j+1;
break;
}
}
}
next[n]=0; //加上这句话是题目的正解,不加这句话就是记录每次的起始位置
// for(int i=0;i<n+1;i++)
// printf("%d ",next[i]);
// printf("\n");
vector<int> result;
int m=text.size();
for (int i=0,j=0; i<m; i++){
if( j<n && text[i]==pattern[j] )
j++;
else {
while(j>0){
j=next[j];
if (text[i]==pattern[j]){
j++;
break;
}
}
}
if( j==n){
result.push_back(i-n+1);
}
}
return result;
}
char a[2000],b[2000];
int main()
{
string pattern,text;
while(scanf("%s",a)!=EOF){
if(a[0]=='#')break;
scanf("%s",b);
text=a;
pattern=b;
ans=get_SubString(pattern,text);
printf("%d\n",ans.size());
}
return 0;
}
例如 aaaaaa aa
如果不加上next[n]=0 得到的结果是 1 2 3 4 5 每次的起始位置。