kmp模板
2016-03-22 22:25
288 查看
我的习惯写法, 自己复习用:
背模板,背模板..............
下面是再次整理的:
#include<cstdio> #include<cstring> #define N 1005 char a , b ; int d1, d2; int next ; void Get_next(){ int i, j; i=1, j=0; next[1]=0; while(j<d2){ if(j==0||b[i]==b[j]){ i++; j++; if(b[i]!=b[j]){ next[i]=j; } else { next[i]=next[j]; } } else { j=next[j]; } } } int kmp(){ int i=0, j=0, cnt=0; while(i<=d1){ if(j==0||a[i]==b[j]){ if(j==d2){ //cnt++;j=0; 子串匹配主串的个数 return i-j+1; //返回的是子串在主串中匹配的第一个位置; } i++; j++; } else j=next[j]; } return -1; //无匹配则返回-1; //return cnt; } int main(){ scanf("%s%s", a+1, b+1); d1=strlen(a+1); //注意在a[1]出开始读入;a[1]处开始计算; d2=strlen(b+1); Get_next(); printf("%d\n", kmp()); }
背模板,背模板..............
下面是再次整理的:
#include<cstdio> #include<cstring> #define MAX 1000000 char a[MAX], b[MAX]; int d1, d2; int next[MAX]; void get_next() { int i, j; i=0, j=-1; next[0]=-1; //数组从0开始,之前是从1开始 while(i<d2) { if(j==-1||b[i]==b[j]) { i++; j++; if(b[i]!=b[j]) { next[i]=j; } else next[i]=next[j]; } else j=next[j]; //j进行回溯, } } int kmp() { int i=0, j=0, cnt=0; while(i<=d1) { if(j==-1||a[i]==b[j]) { i++; j++; if(j==d2) { cnt++; // j=0; 计算不重复匹配时加上;如aaaaaa中aa有三个; } } else j=next[j]; //j进行回溯 } return cnt; } int main() { int t; scanf("%d", &t); for(int i=0; i<t; i++) { scanf("%s%s", (b), (a)); //由于数组从0开始,这里改了. d1=strlen(a); d2=strlen(b); get_next(); printf("%d\n", kmp()); } }和之前稍有不同,建议用下面的模板.
相关文章推荐
- 设计模式之行为型模式 - 调用行为的传递问题
- [div+css]晒晒最新制作专题推广页模板
- 2008大学生入党申请书 模板
- IMAIL多语言模板两套Outlook&Gmail模板下载
- 在PHP中使用模板的方法
- 深入解析php模板技术原理【一】
- Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板中
- 在ASP中不用模板生成HTML静态页直接生成.html页面
- C#模板方法模式(Template Method Pattern)实例教程
- javascript文本模板用法实例
- 关于Asp代码与页面的分离模板技术第1/3页
- php模板原理讲解
- 需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
- DataGrid 动态添加模板列 实现代码
- 详解java模板和回调机制
- C++模板之特化与偏特化详解
- vs.net2008添加模板方法
- KMP算法的C#实现方法
- JavaScript中数据结构与算法(五):经典KMP算法
- ThinkPHP模板判断输出Empty标签用法详解