LA 3026 && POJ 1961 Period (利用kmp中的next数组找最小的循环节 )
来源:互联网 发布:戏曲下载软件 编辑:程序博客网 时间:2024/05/21 11:36
周期( Period, SEERC 2004, LA3026)
给定一个长度为n的字符串S, 求它每个前缀的最短循环节。 换句话
说, 对于每个i(2≤i≤n) , 求一个最大的整数K>1( 如果K存在) , 使得
S的前i个字符组成的前缀是某个字符串重复K次得到。 输出所有存在K的i
和对应的K。
比如对于字符串aabaabaabaab, 只有当i=2,6,9,12时K存在, 且
分别为2,2,3,4。
【 输入格式】
输入包含多组数据。 每组数据第一行为正整数n(2≤n≤106) , 第二行
为一个字符串S。 输入结束标志为n=0。
【 输出格式】
对于每组数据, 按照从小到大的顺序输出每个i和对应的K, 一对整
数占一行。
【 分析】
如果这i个字符组成一个周期串, 那么“错位”部分恰好是一个循环
节, 因此i-f[i]=k*i( 注意k>1, 因此i-f[i]不能等于i, 即必须有f[i]>
0) 。 不难证明反过来也成立。 。 代码如下。
给定一个长度为n的字符串S, 求它每个前缀的最短循环节。 换句话
说, 对于每个i(2≤i≤n) , 求一个最大的整数K>1( 如果K存在) , 使得
S的前i个字符组成的前缀是某个字符串重复K次得到。 输出所有存在K的i
和对应的K。
比如对于字符串aabaabaabaab, 只有当i=2,6,9,12时K存在, 且
分别为2,2,3,4。
【 输入格式】
输入包含多组数据。 每组数据第一行为正整数n(2≤n≤106) , 第二行
为一个字符串S。 输入结束标志为n=0。
【 输出格式】
对于每组数据, 按照从小到大的顺序输出每个i和对应的K, 一对整
数占一行。
【 分析】
如图3-22所示, 根据后缀函数的定义, “错位部分”长度为i-f[i]。
图 3-22
如果这i个字符组成一个周期串, 那么“错位”部分恰好是一个循环
节, 因此i-f[i]=k*i( 注意k>1, 因此i-f[i]不能等于i, 即必须有f[i]>
0) 。 不难证明反过来也成立。
如果这i个字符组成一个周期串, 那么“错位”部分恰好是一个循环
节, 因此i-f[i]=k*i( 注意k>1, 因此i-f[i]不能等于i, 即必须有f[i]>
0) 。 不难证明反过来也成立。 。 代码如下。
//题目中的关键信息一定要找到 //利用kmp中的next数组找最小的循环节 #include<cstdio>#include<iostream>#include<cstring>using namespace std;const int mn=1000010;int Next[mn],n;char s[mn];void getNext(){int i=0,j=-1;Next[0]=-1;while(i<n){if(j==-1||s[i]==s[j]) Next[++i]=++j;else j=Next[j];}}int main(){int T=1;while(~scanf("%d",&n)&&n){scanf("%s",s);getNext();printf("Test case #%d\n",T++);for(int i=2;i<=n;i++)if(Next[i]>0&&i%(i-Next[i])==0) printf("%d %d\n",i,i/(i-Next[i]));puts("");}return 0;}
阅读全文
1 0
- LA 3026 && POJ 1961 Period (利用kmp中的next数组找最小的循环节 )
- 【kmp算法next数组-串的最小循环节/循环周期】Period HDU
- poj 1961 Period (KMP+最小循环节)
- POJ 1961 Period KMP 最小循环节
- POJ 1961 Period【KMP最小循环节】
- POJ 1961 Period(KMP最小循环节)
- HDU 1358 Period (next跳表找最小循环节)KMP
- POJ 1961 Period(next数组求循环节)
- HDu 1358 Period(Next 数组找循环节)
- POJ 1961 Period KMP next数组的应用
- poj 1961 Period(未优化KMP的next数组)
- Kmp找字符串循环节——Period ( POJ 1961 )
- POJ 1961 Period KMP(next数组应用)
- POJ 1961 Period(KMP next数组巧用)
- POJ 1961 Period(kmp循环节)
- POJ 1961 Period——kmp求最小循环节
- LA 3026 Period——kmp求n次最小循环节
- (KMP 1.5)hdu 1358 Period(使用next数组来求最小循环节——求到第i个字符的循环节数)
- 2017 WUST校赛 1009 LL&a+b-c
- 中缀表达式转换成后缀表达式并求值
- 大数据架构和模式(三)理解大数据解决方案的架构层
- 凑平方数
- 【Linux】Ubuntu输入法不能开机自启的解决方法
- LA 3026 && POJ 1961 Period (利用kmp中的next数组找最小的循环节 )
- Respones&&Request
- Debug 模式下使用正式版签名的总结
- Android系统模拟鼠标键盘详解
- Ubuntu下mysql服务的重启命令
- Rescue The Princess(山东省第四届ACM大学生程序设计竞赛 )
- 简单的纳新系统后台php+mysql+oauth2.0认证实现
- 文件路径 正斜杠和反斜杠
- 二分图——vijos1204 CoVH之柯南开锁