您的位置:首页 > 其它

hiho一下~week_3 KMP算法

2016-06-12 22:28 357 查看
描述

http://hihocoder.com/contest/hiho3/problem/1

能不能够判断一段文字(原串)里面是不是存在那么一些……特殊……的文字(模式串)?”

小Hi和小Ho仔细思考了一下,觉得只能想到很简单的做法,但是又觉得既然河蟹先生这么说了,就肯定不会这么容易的让他们回答了,于是他们只能说道:“抱歉,河蟹先生,我们只能想到时间复杂度为(文本长度 * 特殊文字总长度)的方法,即对于每个模式串分开判断,然后依次枚举起始位置并检查是否能够匹配,但是这不是您想要的方法是吧?”

小Ho这时候还有点晕晕乎乎的,但是小Hi很快开口道:”我知道!这就是一个很经典的模式匹配问题!可以使用KMP算法进行求解!“

题目分析:

1、BK朴素匹配算法

2、KMP或者有限自动机

这里只是学习KMP算法,(小白的理解不到位请谅解):

/**
*Author: xiaoran
*Solution:KMP
*
*/
#include<iostream>
#include<stdio.h>
#include<string>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<time.h>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<bitset>
#include<fstream>
#define LL long long
using namespace std;

const int MAXN=1000005;
char t[10005],s[MAXN];
int nxt[10005];
void getNext(char *t){//s模式串
int len=strlen(t);
int i=0,j=-1;
nxt[0]=-1;
while(i<len){
if(j==-1||t[i]==t[j]){
nxt[++i]=++j;
}
else j=nxt[j];

}
}
int kmp(char *t,char *s){
getNext(t);//得到next数组
int ls,lt,i,j,cnt=0;
ls=strlen(s);
lt=strlen(t);
i=0; j=0;
while(i<ls){
if(j==-1||t[j]==s[i]) ++i,++j;
else j=nxt[j];

if(j==lt) cnt++;
}
return cnt;
}

int main()
{

//freopen("E:/input.txt","r",stdin);
//freopen("E:/output.txt","w",stdout);
int k;
scanf("%d",&k);
while(k--){
scanf("%s",t);
scanf("%s",s);
int res=kmp(t,s);
printf("%d\n",res);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: