KMP基础模板- - -看了很多人的模版,总结一下
2015-08-19 10:40
561 查看
KMP看了好久都没看懂,觉得看懂之后自己写了个求Next数组的程序,还是一直无限输出-1。无奈只能继续搜寻大神的代码和思路,
才终于把最基础的查询下标和出现次数问题给解决了,太弱了~_~
经过我认真总(抄)结(袭)的代码:
利用上面的Count_KMP( )函数可以解决HUD1686,稍做修改就可以解决HDU2087,给出链接:HDU1686-Oulipo HDU2087-剪花布条
好吧,其实我就是看的kuangbin的模板: kuangbin的KMP模板
才终于把最基础的查询下标和出现次数问题给解决了,太弱了~_~
经过我认真总(抄)结(袭)的代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAXN = 111111; char s1[MAXN],s2[MAXN]; int Next[MAXN+5]; int lens1,lens2;//还是定义全局变量吧,不知道为什么直接用strlen函数的时候会出错,改成全局变量就对了 void GetNext(int len)//求Next数组,虽然不懂,但就这几行代码,写着写着就背下来了=_=! { Next[0]=-1; int left=-1,right=0; while(right<len) { if(left==-1 || s2[left]==s2[right])//这里是求模式串的Next数组,不要写成了两个不同的字符串比较了=_= Next[++right]=++left; else left=Next[left]; } // for(int i=0;i<len;i++) // printf("%d ",Next[i]); // printf("\n"); } void Index_KMP() { GetNext(lens2); int left=0,right=0;//left是主串下标,right是模式串下标 while(left<lens1&&right<lens2) { if(s1[left]==s2[right]||right==-1)//注意是right等于-1时进来,因为left表示的是主串的下标,防止了回溯,不会减少 { left++; right++; } else right=Next[right];//利用Next数组防止left回溯 } // printf("%d\n",right); // printf("The lenth of s1 is: %d\n",strlen(s1)); // printf("The lenth of s2 is: %d\n",strlen(s2)); if(right==lens2) printf("s2在s1中第一次出现的下标为: %d\n",left-lens2); else printf("-1\n"); return; } void Count_KMP() { if(lens1==1&&lens2==1)//特判长度为1的情况 { if(s1[0]==s2[0]) printf("1\n"); else printf("-1\n"); return; } int left=0,right=0,count=0; while(left<lens1) { if(right==-1||s1[left]==s2[right])//这里是模式串和主串比较,区分求Next数组时的判断条件 { left++; right++; }else right=Next[right]; if(right==lens2)count++,right=Next[right]; } printf("s2在s1中出现的次数为: %d\n",count); return; } int main() { while(~scanf("%s%s",s1,s2)) { lens1=strlen(s1);//主串 lens2=strlen(s2); GetNext(lens2); Index_KMP(); Count_KMP(); } return 0; }
利用上面的Count_KMP( )函数可以解决HUD1686,稍做修改就可以解决HDU2087,给出链接:HDU1686-Oulipo HDU2087-剪花布条
好吧,其实我就是看的kuangbin的模板: kuangbin的KMP模板
相关文章推荐
- C++的深拷贝与浅拷贝
- 经典SQL语句大全(技巧篇)
- UE4 Texture Support and Settings
- 柔性数组成员 长度为0的数组
- 几种数据库的拙见
- 3Des算法
- windows下的git与ssh
- RapidFloatingActionButton框架正式出炉
- P6SPYweblogic配置
- HTTP协议图片上传交互
- 快学Scala习题解答—第一章 基础
- c# 程序员学习android(2)登陆界面
- 经典SQL语句大全(提升篇)
- Android的专用驱动
- Vijos 1164 曹冲养猪(中国剩余定理)
- [使用疑问] 关于 定位手表 设置 电子围栏功能实现疑问
- Windows位图和调色板,bmp文件格式
- iOS下拨打电话
- hdu 1059 Dividing(多重背包优化)
- bfs+STL cf242c