题意: 一个字符串,从头到某个位置,字符串的前缀最多重复了多少次。

转一相关讲解:

kmp next函数 kmp的周期问题,深入了解kmp中next的原理

-----------------------

-----------------------

k    m        x      j       i

由上,next【i】=j,两段红色的字符串相等(两个字符串完全相等),s[k....j]==s[m....i]

设s[x...j]=s[j....i](xj=ji)

则可得,以下简写字符串表达方式

kj=kx+xj;

mi=mj+ji;

因为xj=ji,所以kx=mj,如下图所示

-------------

-------------

k   m        x     j

看到了没,此时又重复上面的模型了,kx=mj,所以可以一直这样递推下去

所以可以推出一个重要的性质len-next[i]为此字符串的最小循环节(i为字符串的结尾),另外如果len%(len-next[i])==0,此字符串的最小周期就为len/(len-next[i]);

求给定字符串含前缀的数量

abab

前缀为

a

ab

aba

abab

abab中共有六个子串是前缀a a ab ab aba abab

所以答案为6

利用kmp中的匹配原理可以完美的解决此题

a---------d-----

-----a---------d

i         j

如上所示,假设两串字符完全相等,next[j]=i,代表s[1...i]==sum[j-i+1....j],这一段其实就是前缀

i~j之间已经不可能有以j结尾的子串是前缀了,不然next【j】就不是 i 了

设dp【i】:以string[i]结尾的子串总共含前缀的数量

所以dp[j]=dp[i]+1,即以i结尾的子串中含前缀的数量加上前j个字符这一前缀

View Code

#include<stdio.h>
#include<string.h>
char m[1000002];
int next[1000002];
int n;
void get()
{int i=0,j=-1;next[0]=-1;while(i<n){if(j==-1||m[i]==m[j]){i++;j++;next[i]=j;}else j=next[j];}
}
int main()
{int k,i,ca=1;while(scanf("%d",&n),n){scanf("%s",m);get();printf("Test case #%d\n",ca++);for(i=2;i<=n;i++){k=i-next[i];if(i%k==0&&i/k>1)printf("%d %d\n",i,i/k);}printf("\n");}
}

转载于:https://www.cnblogs.com/dream-wind/archive/2012/04/26/2470774.html

HDU 1358 Period【KMP】相关推荐

  1. hdu 1358 Period (KMP求循环次数)

    Problem - 1358 KMP求循环节次数.题意是,给出一个长度为n的字符串,要求求出循环节数大于1的所有前缀.可以直接用KMP的方法判断是否有完整的k个循环节,同时计算出当前前缀的循环节的个数 ...

  2. 【KMP】Radio Transmission(最小循环子串)

    [KMP]Radio Transmission(最小循环子串) Description 给你一个字符串,它是由某个字符串不断自我连接形成的.但是这个字符串是不确定的,现在只想知道它的最短长度是多少. ...

  3. 【KMP】OKR-Periods of Words

    [KMP]OKR-Periods of Words 题目描述 串是有限个小写字符的序列,特别的,一个空序列也可以是一个串.一个串P是串A的前缀,当且仅当存在串B,使得A=PB.如果P≠A并且P不是一个 ...

  4. 【kmp】似乎在梦中见过的样子

    参考博客: BZOJ 3620: 似乎在梦中见过的样子 [KMP]似乎在梦中见过的样子 题目描述 「Madoka,不要相信QB!」伴随着Homura的失望地喊叫,Madoka与QB签订了契约. 这是M ...

  5. HDU 6114 Chess 【组合数】(2017百度之星程序设计大赛 - 初赛(B))

    Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  6. ACM入门之【KMP】

    KMP可以O(n)的时间查找出一个字符串在另一个字符串出现的次数和位置. KMP 的精髓在于,对于每次失配之后,我都不会从头重新开始枚举,而是根据我已经得知的数据,从某个特定的位置开始匹配:而对于模式 ...

  7. HDU - 1358 Period(KMP的next数组求最小循环节)

    题目链接:点击查看 题目大意:给出一个长度为n的字符串,问有哪些前缀是周期性字符串 题目分析:因为n给的很大,所以肯定不能暴力判断了,我们可以巧妙的利用kmp的next数组进行判断,next数组有一个 ...

  8. HDU 1686 Oulipo【kmp求子串出现的次数】

    The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e ...

  9. HDU 1358 Period KMP

    题意:求一个字符串的所有前缀是否是复制出来的. 解题思路:next 数值判断即可 解题代码: 1 // File Name: getnext.cpp 2 // Author: darkdream 3 ...

  10. 【bzoj3620】【似乎在梦中见过的样子】【kmp】

    Description "Madoka,不要相信 QB!"伴随着 Homura 的失望地喊叫,Madoka 与 QB 签订了契约. 这是 Modoka 的一个噩梦,也同时是上个轮回 ...

最新文章

  1. 【2021】一位清华大佬的互联网秋招算法岗总结
  2. windowservice创建及部署
  3. NOIP2018退役记
  4. Maven常用命令和代码实操
  5. LeetCode 781. 森林中的兔子(哈希+贪心)
  6. 微信第三方平台-授权流程经验分享
  7. 《Python编程从入门到实践》记录之类继承
  8. C# 模拟鼠标(mouse_event)
  9. urdf与xacro的使用方法 机械臂模型仿真示例
  10. 参加2022年7月PMP考试后感受
  11. 番茄花园GHOST SP3无法安装IIS 信息服务的解决方法
  12. 微信小程序的测试方案总结
  13. 软件测试入门之测试项目启动与研读需求文档(精辟干货)
  14. 换脸算法 X2Face 详解
  15. 快商通智能客服云平台入选中科院《互联网周刊》“智能营销榜”
  16. 单个Java文件打成可执行JAR包
  17. nodejs批量ping
  18. android扫码二维码识别二维码
  19. 如何翻译截图里的英文
  20. java计算器输入框_java实现计算器的输入框

热门文章

  1. 简述JDBC原理 + 在JAVA中异常是什么 + throws 与 throw 区别 + 简单解释以下JAVA中的多态...
  2. 数据库存储 层次、树形结构 的标准做法
  3. Linux下七牛云存储qrsync命令行上传同步工具
  4. Linux系统Load average负载详细解释
  5. 51nod1122 机器人走方格 V4
  6. Javascript:拦截所有AJAX调用,重点处理服务器异常
  7. 在 ASP.NET MVC Web 应用程序中输出 RSS Feeds
  8. 第4章 神经网络和误差反向传播法
  9. Linux中的线程与进程以及调度
  10. [最短路-Floyd][数学]Luogu P1552 牛的旅行