[Hiho]1015-KMP算法
2015-12-12 22:09
423 查看
题目:
输入
第一行一个整数N,表示测试数据组数。
接下来的N*2行,每两行表示一个测试数据。在每一个测试数据中,第一行为模式串,由不超过10^4个大写字母组成,第二行为原串,由不超过10^6个大写字母组成。
其中N<=20
输出
对于每一个测试数据,按照它们在输入中出现的顺序输出一行Ans,表示模式串在原串中出现的次数。
Sample Input
Sample Output
Solution:
需要稍加改造KMP算法,因为有重叠的现象,所以需要将模式串的next数组往后再计算一位,比如ADA,首尾是一样的,那就计算ADAX,X所在next数,这样重叠现象也可解决。
输入
第一行一个整数N,表示测试数据组数。
接下来的N*2行,每两行表示一个测试数据。在每一个测试数据中,第一行为模式串,由不超过10^4个大写字母组成,第二行为原串,由不超过10^6个大写字母组成。
其中N<=20
输出
对于每一个测试数据,按照它们在输入中出现的顺序输出一行Ans,表示模式串在原串中出现的次数。
Sample Input
5 HA HAHAHA WQN WQN ADA ADADADA BABABB BABABABABABABABABB DAD ADDAADAADDAAADAAD
Sample Output
3 1 3 1 0
Solution:
需要稍加改造KMP算法,因为有重叠的现象,所以需要将模式串的next数组往后再计算一位,比如ADA,首尾是一样的,那就计算ADAX,X所在next数,这样重叠现象也可解决。
#include<iostream> #include<string> using namespace std; int * BuildNext(string pattern) { int n = pattern.size(); int* next = new int[n+1]; int k = -1; next[0] = -1; int j = 0; while(j < n) { if(k == -1 || pattern[j] == pattern[k]) { k++; j++; if( j == n || pattern[j] != pattern[k]) { next[j] = k; } else next[j] = next[k]; } else k = next[k]; } return next; } int Search(string pattern,string original) { int n = original.size(); int *next = BuildNext(pattern); int j = 0; int count = 0; for(int i = 0;i<original.size();i++) { if(j > 0 && pattern[j] != original[i]) { j = next[j]; if(j == -1) j = 0; } if(pattern[j] == original[i]) j++; if(j == pattern.size()) { count++; j = next[j]; if(j == -1) j = 0; } } return count; } int main() { char rows; int row = 0; int i,j,k; i = j = k = 0; cin>>row; string* pattern = new string[row]; string* original = new string[row]; for(i = 0;i<row;i++) { cin>>pattern[i]; cin>>original[i]; } for(i = 0;i<row;i++) { int count = Search(pattern[i],original[i]); cout<<count<<endl; } return 0; }
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#获取关键字附近文字算法实例