POJ 2406 Power Strings(后缀数组或KMP或扩展KMP)
来源:互联网 发布:linux下的网络编程 编辑:程序博客网 时间:2024/06/07 10:35
题意:
给你一个字符串求最多循环了多少次(这个题保证了最后一个循环节是完整的)
思路:
就是求最小循环节,这个问题可以用后缀数组,KMP,扩展KMP都能做出来,不过我个人觉得求最小循环节还是扩展KMP最好写了,KMP其次,后缀数组搞这个反而有点多余。。。不过既然论文提到了后缀数组的写法,那就写写好了
首先是扩展KMP,在求出扩展KMP的next数组后,找到第一个
对于KMP,如果
对于后缀数组,枚举长度,如果len%i==0且rak[0]-rak[i]==1且height[rak[0]]==len-i就是一个合格的解,然而这题居然卡倍增的做法,所以代码以后补上
错误及反思:
代码:
首先是扩展KMP的做法:
#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int maxn=1000100;int anext[maxn];char arr[maxn];void getanext(char *str){ int i=0,j,p=1,len=strlen(str); anext[0]=len; while(str[i]==str[i+1]&&i+1<len) i++; anext[1]=i; for(i=2;i<len;i++) { if(anext[i-p]+i<anext[p]+p) anext[i]=anext[i-p]; else { j=max(anext[p]+p-i,0); while(i+j<len&&str[j]==str[j+i]) j++; anext[i]=j; p=i; } }}int main(){ while(scanf("%s",arr)&&arr[0]!='.') { getanext(arr); int len=strlen(arr); for(int i=1;i<=len;i++) { if(anext[i]+i==len&&len%i==0) { printf("%d\n",len/i); break; } } }}
然后是KMP的做法:
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int len,nextval[1100000];char w[1100000];void get_next(){ int j=0,k=-1; nextval[0]=-1; while(j<len){ if(k==-1||w[k]==w[j]) nextval[++j]=++k; else k=nextval[k]; }}int main(){ while(scanf("%s",w)){ if(w[0]=='.') break; len=strlen(w); get_next(); int l=len-nextval[len]; if(l!=len&&nextval[len]%l==0) printf("%d\n",len/l); else printf("1\n"); }}
阅读全文
0 0
- POJ 2406 Power Strings(后缀数组或KMP或扩展KMP)
- POJ 2406 Power Strings KMP 或 后缀数组
- POJ2406 Power Strings 【KMP 或 后缀数组】
- POJ 2406 Power Strings 【后缀数组||KMP】
- POJ 2406 Power Strings <后缀数组(DC3) / KMP>
- POJ 2406 Power Strings(KMP OR 后缀数组,4级)
- poj 2406 Power Strings (用kmp代替后缀数组求解)
- POJ 2406 Power Strings KMP 或者后缀数组
- POJ 2406 后缀数组 或 KMP
- POJ 2406 Power Strings(KMP or 后缀数组 dc3板子)
- poj 2406 Power Strings kmp next数组
- POJ 2406 Power Strings (kmp next数组)
- POJ 2406 Power Strings (KMP next数组应用)
- poj 2406 Power Strings(kmp next数组的应用)
- [KMP][后缀数组] poj2406 Power Strings
- poj 2406 Power Strings 【KMP求最小循环节】【后缀数组求连续重复子串】
- POJ 2406 Power Strings【KMP求最小循环节/后缀数组】
- poj 2406:Power Strings(KMP)
- 沧田TS618K打印机驱动官方版下载
- 【hdu 1863】 畅通工程
- C/C++使用NotePad++DIY一个IDE
- linux shell使用loop和cursor批量修改sql
- 静态代码块的执行顺序
- POJ 2406 Power Strings(后缀数组或KMP或扩展KMP)
- 在Matlab下利用VS调试C/C++代码
- Linux系统Java环境安装配置
- 方格取数(1) HDU
- 传入一个字符串,输出某个字符或者字符串在传入字符串中的所有位置
- 11.2
- CVPR 2017 全部及部分论文解读集锦
- 朴素贝叶斯
- 吴恩达深度学习第四课:卷积神经网络(学习笔记2)