hdu 1686 Oulipo(KMP)
2016-01-23 16:53
246 查看
题意:KMP算法查找模式串在主串中出现的次数。
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; #define MAXN 10005//字符串长度 char W[MAXN]; char T[1000005]; int _next[MAXN]; void GetNext(char t[]) //求next数组 { int j,k,len; j=0;//从0开始,首先求_next[1] k=-1;//比较指针 _next[0]=-1;//初始值-1 len=strlen(t); while(j<len) { if(k==-1||t[j]==t[k]) //指针到头了,或者相等 { ++j; ++k; _next[j]=k;//此句可由优化替代 /*优化(求匹配位置时可用) if(t[j]!=t[k])_next[j]=k; else _next[j]=_next[k]; //*/ } else k=_next[k]; } } int KMPCount(char s[],char t[]) //统计子串在主串中的出现次数,可重叠 { int i,j,lens,lent,cnt; i=j=0; lens=strlen(s); lent=strlen(t); cnt=0; while(i<lens) { if(j==-1||s[i]==t[j]) { ++i; ++j; } else j=_next[j]; if(j==lent) { ++cnt;//每当成功匹配,则计数 //j=0; 此时j不用置0,为了计算出模式串在主串中重叠的部分 } } return cnt; } int main() { int TT; scanf("%d",&TT); while(TT--) { scanf("%s",W); scanf("%s",T); GetNext(W); printf("%d\n",KMPCount(T,W)); } return 0; }
相关文章推荐
- [小知识] 获取浏览器UA标识
- IOS开发之ZBarReaderView的使用
- iOS 【资源篇】
- js 字符串格式化format函数扩展
- 编码规范系列(二):Eclipse Checkstyle配置
- Python -- 文件处理
- hdu 1711 Number Sequence(KMP算法)
- centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue 第三十六节课
- 一种后台网络服务器模型
- MySQL中快速复制数据表方法汇总
- Android 静默安装
- Python环境的搭建
- 编码规范系列(一):Eclipse Code Templates设置
- JavaSE-接口之工厂方法的设计
- python-opencv的一段比较稳定的摄像头视频读取代码
- 连续出现的字符题解
- Android经典的大牛博客推荐
- poj--1273(最大流基础题)
- 安装QT
- html页面通过特殊链接:打电话,发短信,发邮件详细教程