POJ 2752、2406、1961 KMP的next[](或p[])简单应用
来源:互联网 发布:java求100 200的素数 编辑:程序博客网 时间:2024/05/16 12:52
以下几题都是对p[](或next[])的简单应用。做了这几题,能在一定程度上加深对p数组初始化的理解。
POJ 2752 Seek the Name, Seek the Fame
题目的意思就是求一个字符串的子串可能的长度,子串需满足既是母串的前缀又是母串的后缀。
这题是对p数组的应用。想一下字符串自己跟自己匹配的过程,就知道怎么做了。假设s1和s2匹配(s1==s2,令m=strlen(s1)),开始时完全匹配,符合条件;然后s2往右
移,直到使其前一部分与s1的最后完全匹配,(这就是在求p[m]);依次下去,求p[p[m]]…;直到p[…]=0。
代码:
#include<stdio.h>#include <string.h>char b[400001];int m,p[400001];int store[400001];void getp(){p[1]=0;int i,j=0;for(i=2;i<=m;i++){while(j>0&&b[j+1]!=b[i]) j=p[j];if(b[j+1]==b[i]) j+=1;p[i]=j;}}int main(){int k;while(~scanf("%s",b+1)){m=strlen(b+1);getp();k=m;int i=0;store[i++]=m;while(p[m]){m=p[m];store[i++]=m;}i--;for(;i>0;i--)printf("%d ",store[i]);printf("%d\n",store[0]);}return 0;}
POJ 2406 Power Strings
给出有周期性的字符串,求其最大的周期数(即每个周期元素最少,使整个周期数最大)。
根据p数组就可以很容易的得出。
代码:
#include <stdio.h>#include <string.h>char b[1000001];int m,p[1000001];int getp(){p[1]=0;int i,j=0;for(i=2;i<=m;i++){while(j>0&&b[j+1]!=b[i]) j=p[j];if(b[j+1]==b[i]) j+=1;p[i]=j;}return 0;}int main(){ while(~scanf("%s",b+1)&&b[1]!='.'){m=strlen(b+1);getp();int k=m-p[m];if(m%k==0&&m/k>1)printf("%d\n",m/k);else printf("1\n");//m%k!=0||m/k==1}return 0;}
POJ 1961 Period
找出所给字符串的所有前缀中符合周期性条件的,并输出其长度及周期长。
代码:
#include<stdio.h>char b[1000001];int m,p[1000001];void getp(){p[1]=0;int i,j=0;for(i=2;i<=m;i++){while(j>0&&b[j+1]!=b[i]) j=p[j];if(b[j+1]==b[i]) j+=1;p[i]=j;}}int main(){int k,count=0;while(~scanf("%d",&m)&&m){scanf("%s",b+1);getp();printf("Test case #%d\n",++count);for(int i=2;i<=m;i++){if(!p[i])continue;k=i-p[i];if(i%k==0&&p[i]!=0)printf("%d %d\n",i,i/k);}printf("\n");}return 0;}
- POJ 2752、2406、1961 KMP的next[](或p[])简单应用
- POJ 1961 KMP的next数组应用
- POJ 2406 KMP next数组的应用
- POJ 2752: Seek the Name, Seek the Fame(简单KMP-NEXT数组的应用)
- poj 2406 Power Strings KMP的next数组的应用
- poj 1961 kmp算法之next数组的意义应用
- POJ 1961 Period KMP next数组的应用
- POJ 2752 KMP算法中next数组的应用
- poj 2752 kmp(next数组的应用)
- POJ 2752 KMP中next数组的应用
- Power Strings POJ 2406【KMP Next的应用】
- poj 2406 Power Strings(kmp next数组的应用)
- poj-2406 kmp中的next数组应用
- poj 2406 kmp next数组应用
- Period(kmp简单的应用 next从零开始 )
- poj 1961kmp next的再理解
- POJ 2406 kmp简单应用
- HDU 2752 kmp next的应用
- 韩媒称韩国海警用橡皮弹打死1名中国船员
- Discover the secrets of the Java Serialization API
- CSDN高校俱乐部2012年秋季巡讲安排及讲师介绍
- cPanel添加绑定第二个域名或更多域名_暂时未成功
- android 手机 华为c8650e 无法在mac下 utuntu 下调试 googole调试模式 #*#*
- POJ 2752、2406、1961 KMP的next[](或p[])简单应用
- 天津海洋功能区划获批复 排海污水须100%达标-天津海洋功能区划-污水-达标率
- GC调用时机,特殊内存回收时机,及调试时强制GC
- hdu 1176 免费馅饼
- sqlite database lock problem in android content providers
- 关于http
- iPhone图片拉伸:resizableImageWithCapInsets
- 练习转义字符
- 我国首次倡导24小时饥饿警醒世人爱粮节粮-24小时饥饿-禁食-世界粮食日