Kmp找字符串循环节——Period ( POJ 1961 )
来源:互联网 发布:乎字的意义和用法 编辑:程序博客网 时间:2024/05/16 20:41
题目链接:
http://poj.org/problem?id=1961分析:
给出一个字符串长度为N,从左变开始取2~N个字符出来构成一个新字符串,若新字符串能被一个最短的循环节构成则输出新字符串的长度和循环节循环次数。题解:
直接用Kmp里的SetNext()函数,求出该字符串里每一个字符的重复位置,用2~N长度减去以该长度为下标对应Next数组里的值即重复位置得到该两个重复出现字符间的长度,若字符串长度能被该长度整除则说明这段长度的字符是字符串的最短循环节,就可以输出。AC代码:
#include <iostream>#include <cstring>#include <cstdio>#include <queue>#include <algorithm>#include <cmath>using namespace std;char b[1234567];int Next[1234567];int cnt;int n;void SetNext()//子串的next数组,如果只看代码的话,很难得出值的确定方法。{ int i=0,j=-1; Next[0]=-1; while(i<n) { if(j==-1||b[i]==b[j])//b为模式数组 { i++; j++; Next[i]=j; } else j=Next[j]; }}int main(){ int t = 1; while(scanf("%d", &n) && n) { scanf("%s", b); SetNext(); cout <<"Test case #" <<t++<<endl; for(int i=1;i<=n;i++)//遍历各个长度的字符串找其循环节 { //cout << Next[i] << endl; int length = i-Next[i]; //循环节的长度 //cout << length << endl; if(i != length && i % length == 0) printf("%d %d\n", i, i/length); } printf("\n"); } return 0;}
0 0
- Kmp找字符串循环节——Period ( POJ 1961 )
- POJ 1961 Period——kmp求最小循环节
- poj 1961 Period (KMP+最小循环节)
- POJ 1961 Period KMP 最小循环节
- POJ 1961 Period(kmp循环节)
- POJ 1961 Period kmp求循环节
- POJ 1961 Period【KMP最小循环节】
- LA 3026 && POJ 1961 Period (利用kmp中的next数组找最小的循环节 )
- HDU1358 Period(KMP,找循环节)
- poj 1961 Period(KMP, 最短循环节)
- poj 1961 Period(kmp最短循环节)
- poj 1961 Period (KMP 最短循环节)
- POJ 1961 Period(KMP最小循环节)
- 【POJ 1961】Period(KMP求循环节)
- 【 poj 1961 】Period 【KMP 求所有前缀的循环节】
- POJ 1961 Period(KMP 求循环)
- POJ 2406 Power Strings (KMP找字符串的循环节)
- HDU1358 Period(KMP找循环前缀)
- 各个手机尺寸对应的像素
- jquey点击table行 获取行数据 赋值到其他控件
- 16. 试用vSphere 6(三):安装vCenter 6(独立数据库)之:vCenter安装与配置
- oracle 死锁现象重现,查询及处理
- docker网络配置基础
- Kmp找字符串循环节——Period ( POJ 1961 )
- WCF、WebAPI、WCFREST、WebService之间的区别
- 突出一个简单粗暴!Android Activity泄漏问题解决方案
- poj 1328 Radar Installation
- Http协议详解
- 学习记录-Qt的多工程管理
- android中Android Studio Error:Dependency报错解决方案
- service list命令的实现
- 如何设定jbutton的大小(使其大小固定,不因布局方式改变而改变???)