KMP 模板
2015-09-03 15:23
316 查看
#include<iostream> #include<string.h> #include<string> #include<stdio.h> #include<cstring> #define maxn 10000 using namespace std; int f[maxn]; void getfail(char *p,int *f){ int m=strlen(p); f[0]=0;f[1]=0; for(int i=1;i<m;i++){ int j=f[i]; while(j&&p[i]!=p[j])j=f[j]; f[i+1]=p[i]==p[j]?j+1:0; } } int find(char* t,char* p,int* f){//t匹配串(主) p模式串(子) int n=strlen(t),m=strlen(p); getfail(p,f); int j=0; for(int i=0;i<n;i++){ while(j&&p[j]!=t[i])j=f[j]; if(p[j]==t[i])j++; if(j==m)return i-m+1; } return -1; } int main(){ char p[maxn]; char t[maxn]; cin>>p>>t; if(find(t,p,f)==-1){ puts("NO"); } else cout<<find(t,p,f)<<endl; }
如果对于next数组中的i,符合i%(i-next[i])==0&&next[i]!=0则说明字符串循环,而且循环长度为:i-next[i] 循环次数为:i/(i-next[i])。
abcd循环节长度为4 abca 3 aba 2 abab循环节长度2
相关文章推荐
- Java记录 -19- 单例模式
- 通达OA 小飞鱼工作流在线培训教程(八)常用表单控件
- 通达OA 小飞鱼工作流在线培训教程(八)常用表单控件
- If You Design It, You Should Be Able to Code It
- 【阿里笔试+蘑菇街面试】向来缘浅,奈何情深
- 布线问题
- Linux之文件系统管理
- phalapi改动的地方
- nyoj 327 亲和串 【kmp(好题)】
- 关于Android开发中Java对象序列化的一次测试
- Stretch Key Dimensions to See What Breaks
- 频道发布与消息订阅
- Objective-C 【This is ARC】
- KVO实现机制 & 如何自己动手实现 KVO
- Objective-C 【This is ARC】
- E. Bear and Drawing
- ubifs烧写遇到《UBI error: ubi_io_read: error -1 while reading 64 bytes from PEB》
- sass 安装使用杂记
- 给内联元素设置宽高的几种方式
- Effective C++ 改善程序与设计的55个具体做法 二周目笔记01