hihoCoder #1015 : KMP算法
来源:互联网 发布:北京行知学校 编辑:程序博客网 时间:2024/06/06 20:09
题目:
输入 第一行一个整数N,表示测试数据组数。
接下来的N*2行,每两行表示一个测试数据。在每一个测试数据中,第一行为模式串,由不超过10^4个大写字母组成,第二行为原串,由不超过10^6个大写字母组成。
其中N<=20
输出 对于每一个测试数据,按照它们在输入中出现的顺序输出一行Ans,表示模式串在原串中出现的次数。
样例输入5HAHAHAHAWQNWQNADAADADADABABABBBABABABABABABABABBDADADDAADAADDAAADAAD样例输出31310
算法如题,典型的kmp算法,稍微有一点改动。
其实kmp算法也简单,一个next数组,然后每当模式串在下标为n时匹配失败,立刻匹配到next[n]对应的值作为下标即可。而next数组则遍历一遍模式串即可。
kmp详细学习网址:http://blog.csdn.net/v_july_v/article/details/7041827
这里与传统的kmp不同之处在于匹配完一个之后不是立刻停止,而是继续匹配,所以在next数组中必须得保存模式串长度+1个数,因为这个一直超时,因为我是用的每次匹配成功直接以上一次匹配成功的最后一个为下一次的第一个,没想到这样也会超时。
下面放上代码:
#include<stdio.h>#include<string.h>#include<iostream>using namespace std;int main(){ int counts; cin>>counts; while(counts--){ char s[1000005],p[10005]; int next[10005]; getchar(); cin>>p; getchar(); cin>>s; next[0]=-1; int plen = strlen(p); int j=-1,k=0; while(k < plen ){ if(j == -1 || p[j] == p[k]){ j++; k++; next[k] = j; }else{ j = next[j]; } } int i,t,slen; t = 0; i=0; slen = strlen(s); plen = strlen(p); int num = 0; while(i<slen){ if(t==-1 || s[i] == p[t]){ t++; i++; }else{ t = next[t]; } if(t == plen){ num++; } } cout<<num<<endl; } 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算法
- C#常用关键字
- 15muduo_base库源码分析(六)
- 阿里2018测评编程题——小明购物。。。
- 关注国情民情
- nginx
- hihoCoder #1015 : KMP算法
- 和正确的人在一起
- 关注民生民情
- 高性能服务器项目汇总
- 《华为机试在线训练》之简单错误记录
- uva11987(加权并查集的删除操作)
- java 标识符的命名规范
- Java I/O流复习(三)—转换流、内存流、打印流、对象流、RandomAccessFile类、装饰者模式
- Fork-Join框架