hdu 1686 Oulipo
http://acm.hdu.edu.cn/showproblem.php?pid=1686
问题描述:字符串匹配次数
暴力复杂度O(n×m),无谓的比较过多;kmp算法能优化到O(n+m),直接套板
思路
kmp()算法。if(j>=m)成功匹配并计数,最后返回
参考代码
#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) ans++,j=Next[j];
}
return ans;//返回成功匹配的次数
}
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
#endif // ONLINE_JUDGE
int T;cin>>T;
while(T--){
cin>>b>>a;
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