您的位置:首页 > 其它

HDU 2087 剪花布条 kmp

2013-05-03 00:54 274 查看
题目链接

坑的kmp  最后写成这样了~~

当 next
=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
=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
=0      得到的结果是 1 2 3 4 5 每次的起始位置。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法