KMP模板
来源:互联网 发布:单片机仿真软件怎么用 编辑:程序博客网 时间:2024/04/29 18:21
风格一:出处大白(●—●)
#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<cstring>using namespace std;const int maxn = 110;char s[maxn];char p[maxn];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) { 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(){ scanf("%s%s",s,p); cout<<find(s,p,f)+1; return 0;}
风格二[主流风格]
void get_next(){ int k=-1,j=0; next[0]=-1; while(j<pl) { if(k==-1||p[j]==p[k]) { j++;k++; next[j]=k; } else k=next[k]; }}int KMP(){ int i=0,j=0; get_next(); while(j<pl&&i<sl) { if(j==-1||s[i]==p[j]) { i++;j++; } else j=next[j]; if(j==pl) { sum++;j=next[j]; } } return sum;}
略微改进
void get_next(){ int k=-1,j=0; next[0]=-1; while(j<pl) { if(k==-1||p[j]==p[k]) { j++;k++; // next[j]=k; if(next[j]!=next[k])next[j]=k; else next[j]=next[k]; } else k=next[k]; }}int KMP(){ int i=0,j=0; get_next(); while(j<pl&&i<sl) { if(j==-1||s[i]==p[j]) { i++;j++; } else j=next[j]; if(j==pl) { sum++;j=next[j]; } } return sum;}
1 0
- KMP模板
- KMP 模板
- kmp模板
- kmp模板
- kmp模板
- KMP模板
- kmp模板
- kmp模板
- KMP 模板
- 【模板】KMP
- KMP模板
- KMP模板
- 【KMP 模板】
- KMP模板
- KMP 模板
- kmp模板
- KMP模板
- KMP 模板
- hdu 1423(最长公共上升子序列)
- 正则表达式替换字符
- 这8大信用卡秘密!银行绝不会说
- eclise项目中文转码
- 正则表达式表单验证
- KMP模板
- 《剑指offer》-把字符串转换成整数
- linux编译软件
- 操作系统思考 第八章 多任务
- Oracle OCP笔记(29)RMAN备份 - Config
- C++体会
- ubuntu14 启用中文输入法
- Oracle OCP笔记(30)数据库恢复
- 探索《How Tomcat Works》心得 七 Session