hihoCoder 1015 KMP算法
来源:互联网 发布:塞班看图软件 编辑:程序博客网 时间:2024/06/04 17:43
点击打开链接
#1015 : KMP算法
时间限制:1000ms
单点时限:1000ms
内存限制:256MB
- 样例输入
5HAHAHAHAWQNWQNADAADADADABABABBBABABABABABABABABBDADADDAADAADDAAADAAD
- 样例输出
31310
描述
小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进。
这一天,他们遇到了一只河蟹,于是河蟹就向小Hi和小Ho提出了那个经典的问题:“小Hi和小Ho,你们能不能够判断一段文字(原串)里面是不是存在那么一些……特殊……的文字(模式串)?”
小Hi和小Ho仔细思考了一下,觉得只能想到很简单的做法,但是又觉得既然河蟹先生这么说了,就肯定不会这么容易的让他们回答了,于是他们只能说道:“抱歉,河蟹先生,我们只能想到时间复杂度为(文本长度 * 特殊文字总长度)的方法,即对于每个模式串分开判断,然后依次枚举起始位置并检查是否能够匹配,但是这不是您想要的方法是吧?”
河蟹点了点头,说道:”看来你们的水平还有待提高,这样吧,如果我说只有一个特殊文字,你能不能做到呢?“
小Ho这时候还有点晕晕乎乎的,但是小Hi很快开口道:”我知道!这就是一个很经典的模式匹配问题!可以使用KMP算法进行求解!“
河蟹满意的点了点头,对小Hi说道:”既然你知道就好办了,你去把小Ho教会,下周我有重要的任务交给你们!“
”保证完成任务!”小Hi点头道。
提示一:KMP的思路
提示二:NEXT数组的使用
提示三:如何求解NEXT数组
输入
第一行一个整数N,表示测试数据组数。
接下来的N*2行,每两行表示一个测试数据。在每一个测试数据中,第一行为模式串,由不超过10^4个大写字母组成,第二行为原串,由不超过10^6个大写字母组成。
其中N<=20
输出
对于每一个测试数据,按照它们在输入中出现的顺序输出一行Ans,表示模式串在原串中出现的次数。
得到next表
void getnext(char* p,int next[]) { int pLen = strlen(p); next[0] = -1; int k = -1; int j = 0; while (j < pLen - 1) { //p[k]表示前缀,p[j]表示后缀 if (k == -1 || p[j] == p[k]) { ++k; ++j; next[j] = k; } else { k = next[k]; } } } //优化过后的next 数组求法 void getnext(char* p, int next[]) { int pLen = strlen(p); next[0] = -1; int k = -1; int j = 0; while (j < pLen - 1) { //p[k]表示前缀,p[j]表示后缀 if (k == -1 || p[j] == p[k]) { ++j; ++k; //较之前next数组求法,改动在下面4行 if (p[j] != p[k]) next[j] = k; //之前只有这一行 else //因为不能出现p[j] = p[ next[j ]],所以当出现时需要继续递归,k = next[k] = next[next[k]] next[j] = next[k]; } else { k = next[k]; } } }
kmp匹配
int KmpSearch(char* s, char* p) { int i = 0; int j = 0; int sLen = strlen(s); int pLen = strlen(p); while (i < sLen && j < pLen) { //①如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++ if (j == -1 || s[i] == p[j]) { i++; j++; } else { //②如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j] //next[j]即为j所对应的next值 j = next[j]; } } if (j == pLen) return i - j; else return -1; }下面是ac代码
#include<cstdio>#include<cstring>#include<iostream>using namespace std;char mo[10005];char str[1000005];int main(){ int N; scanf("%d",&N); while(N--) { scanf("%s%s",mo,str); int next[10005]= {-1}; int len=strlen(mo); int i=0,j=-1; while(i<len) { if(j==-1||mo[i]==mo[j]) { ++i; ++j; next[i]=j; } else j=next[j]; } int len1=strlen(str); int ans=0; i=0,j=0; while(i<len1) { if(j==-1||str[i]==mo[j]) i++,j++; else j=next[j]; if(j==len) ans++; } printf("%d\n",ans); } return 0;}
阅读全文
0 0
- hihoCoder - 1015 - KMP算法
- [HiHoCoder]#1015 : KMP算法
- hihoCoder#1015 KMP算法
- hihocoder#1015 : KMP算法
- hihoCoder 1015 : KMP算法
- hihoCoder #1015 : KMP算法
- hihoCoder#1015 KMP算法
- hihocoder #1015 KMP算法
- hihoCoder 1015 KMP算法
- hihoCoder 1015 KMP算法
- hihocoder #1015 kmp算法
- hihoCoder 1015 kmp算法
- hihocoder 1015 KMP算法
- hihoCoder 1015 KMP算法
- [HihoCoder]#1015 : KMP算法
- hihoCoder 1015 : KMP算法
- hihoCOder #1015 : KMP算法
- hihocoder 1015 KMP算法
- 有向图的强连通分量分解
- 觉
- 每个 Web 开发者都应该知道的关于 URL 编码的知识
- MOB短信验证快速集成3.0.0及以上
- ios-GCD中的其他操作和创建单例对象的对比
- hihoCoder 1015 KMP算法
- shiro 配置
- vue里发请求用axios
- Alamofire源码解读系列(四)之参数编码(ParameterEncoding)
- 记录下Ubuntu14.04+opencv2.4.13+Qt4/Qt5+Opengl环境搭建遇到的问题
- 爬取北京这个页面的网页信息
- 方法的重载和重写的区别(续)
- 上传图片及添加水印一般处理程序的
- 智能小车四《串口通信》