hdu 2087 剪花布条
http://acm.hdu.edu.cn/showproblem.php?pid=2087
问题描述:字符串匹配次数,匹配成功模主串失效
思路
kmp()算法。if(j>=m)成功匹配模式串从0开始继续匹配,用时计数
参考代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<vector>
#include<set>
#include<map>
#include<algorithm>
#include<sstream>
#define eps 1e-9
#define pi acos(-1)
#define long long ll
using namespace std;
const int _max = 5e4 + 10;
int n,m;
string a,b;
int Next[10010];//大小取决模式串m
void getNext(){//预处理
int i = 0;
int j = Next[0] = -1;
while(i < m){
if(0 > j||b[i] == b[j]) Next[++i] = ++ j;
else j = Next[j];
}
}
int kmp(){//首次匹配成功位置,b是模式串,a是主串,类型不限,
getNext();
int i = 0,j = 0;
int ans = 0;
while(j < m&& i < n){
if(0 > j||a[i] == b[j]) i++,j++;
else j = Next[j];
if(j >= m) j = 0,ans++;//成功匹配,模式串从0开始
}
return ans;
//return i - j;//i-j>n-m匹配失败,成功返回初始匹配位置
}
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
#endif // ONLINE_JUDGE
while(cin>>a&&a!="#"){
cin>>b;
n = a.size();
m = b.size();
printf("%d\n",kmp());
}
return 0;
}
- 加粗
Ctrl + B
- 斜体
Ctrl + I
- 引用
Ctrl + Q
- 插入链接
Ctrl + L
- 插入代码
Ctrl + K
- 插入图片
Ctrl + G
- 提升标题
Ctrl + H
- 有序列表
Ctrl + O
- 无序列表
Ctrl + U
- 横线
Ctrl + R
- 撤销
Ctrl + Z
- 重做
Ctrl + Y