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算法,(小白的理解不到位请谅解):
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; }
相关文章推荐
- SQL Server获取存储过程、表、自定义函数的最后修改时间
- Android开发——Bitmap,byte[],Drawable相互转化
- Hello Python
- mongoose的基本操作(一)
- Markdown使用技巧总结
- (三)模板模式
- LeetCode OJ 6. ZigZag Conversion
- 从今天起接下来的12天,我会分享学习HTML5的心得!
- 对linux中的文件描述符的认识及grep
- P V操作
- python中字符串的操作符+,和*号
- Java集合框架中list.set.map特点
- 堆排序的非递归实现
- SICP 联系2.27 实现deep-reverse
- 高性能高并发--分布式,集群
- 投票选举
- canvas转盘抽奖的实现(一)
- msysGit管理GitHub代码
- jQuery EasyUI-异步树后台代码与数据库设计
- Ubuntu14.04编译安装Kernel(上)