poj 2752 KMPnext[]数组的理解 以及 两种优化
2016-02-01 00:12
260 查看
poj 2752 此题易解为: #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; char a[400005]; int next[400005]; int len; void getnext() { int i=0,k=-1; next[0]=-1; while(i<len) { if(k==-1||a[i]==a[k]){ i++; k++; next[i]=k; } else k=next[k]; } } void deal(int n){ if(next >=0) deal(next ); if(n>0) printf("%d ",n); } int main() { while(scanf("%s",a)!=EOF) { len=strlen(a); getnext(); deal(len); puts(""); } return 0; } 求next[]数组优化 1:void getnext(){ int len=strlen(a); nexta[0]=-1; int k=-1; int j=0; while(j<len) { if(k==-1||a[j]==a[k]){ ++j; ++k; if(a[j]!=a[k]) nexta[j]=k; else nexta[j]=nexta[k]; } else k=nexta[k]; } }
优化2:
void GetNextval(char *p, int next[]){int pLen = strlen(p);next[0] = -1;int k = -1;int j = 0;int mLen = pLen - 1;while (j < mLen){if (p[++j] != p[++k]){next[j] = k;k = next[k];//把原来外面else的条件直接提到此处,省去一次循环与比较}else{next[j] = next[k];}}}
相关文章推荐
- poj 1961 2406 让你彻底理解KMP的next[]数组的两个题目
- K-Means++ 聚类之数据可视化:使用gnuplot
- 谈谈开发者眼中的编程语言是怎样的?
- 荣耀4CROOT 成功!附本人ROOT过程——KINGROOT
- kali linux: /android-sdk-linux/platform-tools/adb: 没有那个文件或目录
- 美国罗斯福纪念公园墙上刻着的一段总统名言
- CentOS 6.2 下安装QQ2012完全可用
- 3.3.3 改变目标(运行级别)—— RHEL7 / CentOS7
- 正则表达式pcre在Android下的移植
- repo—清华TUNA镜像源—Android (AOSP)—CyanogenMod Android for Motorola Defy
- Linaro公司基于GCC推出的的ARM交叉编译工具
- 美国海军采购Linux系统去引导无人机舰队
- systemtap 在Ubuntu上安装
- Debian / Ubuntu Linux: Setup Wireless Access Point (WAP) with Hostapd
- (OK) android——Repo sync cm—解决—error
- linux设备驱动归纳总结(三):2.字符型设备的操作open、close、read、write
- Linux 从虚拟地址到物理地址
- airbase-ng stops working after a while--wifi热点只能连接20秒左右
- android——CyanogenMod rom编译尝试(简记)
- sed