kmp模板
来源:互联网 发布:淘宝旅行网机票预订 编辑:程序博客网 时间:2024/06/02 01:48
我的习惯写法, 自己复习用:
#include<cstdio>#include<cstring>#define N 1005char a[N], b[N];int d1, d2;int next[N];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 1000000char 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()); }}和之前稍有不同,建议用下面的模板.
0 0
- KMP模板
- KMP 模板
- kmp模板
- kmp模板
- kmp模板
- KMP模板
- kmp模板
- kmp模板
- KMP 模板
- 【模板】KMP
- KMP模板
- KMP模板
- 【KMP 模板】
- KMP模板
- KMP 模板
- kmp模板
- KMP模板
- KMP 模板
- servlet示例四:与数据库交互
- 项目4-编写求出1*3*5..*n.的阶乘
- CentOS-6.3安装配置JDK-7
- [Java GC]Java垃圾回收
- 使用内置的Camera应用程序
- kmp模板
- 稚嫩的Alpha1s和我们
- shell比对文本文件
- 【Design Pattern】简单工厂模式
- codeforces_612A. The Text Splitting
- 实验c++实验2-分段函数求值
- 最简单的基于Flash的流媒体示例:网页播放器(HTTP,RTMP,HLS)
- msado15.tlh(407) : warning C4146: unary minus operator applied to unsigned type, result still unsign
- 图解double free 原理