#1015 : KMP
2016-04-18 22:47
232 查看
#include <iostream> using namespace std; void buildnext(const char *pattern,int l,int *next) { int i=0;//i 为next数组下标 int j=-1;//j 为next数组值 j=-1说明没有前面没有任何一个值相等 next[0]=-1; while(i<l) { if(j==-1||pattern[i]==pattern[j]) { i++; j++; next[i]=j; } else j=next[j]; } } int KMP(const char* primary,const char *pattern,int n1,int n2) { int *next=(int *)malloc(n2*sizeof(int)); buildnext(pattern,n2,next); int count=0;//记录pattern 出现的次数 int i=0; int j=0; while(i<n1&&n1-i>=n2-j) { if(primary[i]==pattern[j]) { i++; j++; if(j==n2) { j=0; count++; i=i-1; //i=i-n2+1; } } else { j=next[j]; if(j==-1) { i++; j++; } } } return count; } int main() { int n; cin>>n; for(int i=0;i<n;i++) { string primary,pattern; cin>>pattern; cin>>primary; cout<<KMP(primary.c_str(),pattern.c_str(),primary.size(),pattern.size())<<endl; } return 0; }
相关文章推荐
- Android之Dialog详解
- UVA_10336_Divisibility
- Struts2框架中OGNL表达式的学习
- 思科防火墙ASA端口映射
- iOS _BSMachError: (os/kern) invalid capability (20)
- css的repaint和reflow
- 4.Java中获取当前目录的方法
- 敏捷风暴2016(广州站)
- 关于java中bean拷贝的思考
- Markdown 常用技巧
- Selinux SeAndroid理解
- C++ 中Traits技术 (4) —— 类型推导
- 2 ARM7的三级流水线过程
- css sprite
- Android 值动画一(ObjectAnimator)
- App更新策略课程-定义后台更新服务
- HANDLE,HMODULE,HINSTANCE,HWND概念
- 从mysql官网下载mysql安装包
- 位运算总结
- android开发 用线程进行耗时操作,统一处理