kmp算法模板
来源:互联网 发布:网上招淘宝客服可信吗 编辑:程序博客网 时间:2024/05/19 00:54
kmp算法:
//求解原串中包含多少模式串,模式串可以互相覆盖,不能覆盖的稍微修改一下即可char ori[N*100], pat[N];//ori为原串,pat为模式串int Next[N];//两个get_next函数,任选其一//void get_next(char *pat)//{// int i = 0, j = -1;// Next[0] = -1;// while(pat[i])// {// if(j == -1 || pat[i] == pat[j]) Next[++i] = ++j;// else j = Next[j];// }//}void get_next(char *pat){ int i = 0, j = -1; Next[0] = -1; while(pat[i]) { if(j == -1 || pat[i] == pat[j]) { ++i, ++j; if(pat[i] != pat[j]) Next[i] = j; else Next[i] = Next[j]; } else j = Next[j]; }}int kmp(char *ori, char *pat){ get_next(pat); int ans = 0; int i = 0, j = 0; while(ori[i]) { if(j == -1 || ori[i] == pat[j]) ++i, ++j; else j = Next[j]; if(j != -1 && !pat[j]) ans++, j = Next[j];//模式串不能互相覆盖,改j=0即可 } return ans;}int main(){ int t; scanf("%d", &t); while(t--) { scanf("%s%s", pat, ori); int ans = kmp(ori, pat); printf("%d\n", ans); } return 0;}
//求解字符串的最大循环次数,也就是先求出最小循环周期,在用长度除之const int N = 1000000 + 10;char ori[N], pat[N];int Next[N];void get_next(char *pat)//必须用这个get_next函数{ int i = 0, j = -1; Next[0] = -1; while(pat[i]) { if(j == -1 || pat[i] == pat[j]) Next[++i] = ++j; else j = Next[j]; }}int main(){ while(~scanf("%s", pat)) { get_next(pat); int len = strlen(pat); //满足len % (len - Next[len]) == 0说明字符串是循环的,否则不循环 if(len % (len - Next[len]) == 0) printf("%d\n", len / (len - Next[len])); else printf("1\n"); } return 0;}
阅读全文
0 0
- 【KMP】KMP算法模板
- kmp算法模板
- kmp算法模板
- KMP算法模板
- KMP算法模板
- KMP算法(模板)
- KMP算法模板
- KMP算法标准模板
- KMP算法模板
- KMP算法模板
- KMP算法模板
- KMP算法模板
- KMP算法模板
- KMP 算法模板
- kmp算法模板
- kmp算法模板
- KMP算法模板
- KMP算法模板
- 微信小程序一个页面多个picker实现
- easyui刷新当前tab
- Java多线程安全之对象的发布和溢出、线程封闭详解
- 分苹果
- java 学习笔记之位移运算符
- kmp算法模板
- Qt4和Qt5之qt-vs-addin插件如何共存与使用
- Linux vi/vim编辑器常用命令与用法总结
- 数人云|当K8S遇上微服务-京东金融PaaS平台思考与实践
- localStorage使用总结
- instanceof, isinstance,isAssignableFrom的区别(转)
- 破解,实验吧之证明自己吧
- mysql外键约束
- java-逻辑运算符