题意:给定一个字符串,求他每一个前缀,如果他是周期的,求len/最短循环节。

分析:

复习一下KMP,之前有详细解析。

由于朴素匹配每次移动一位,KMP可以多移动 f[i] 位,f 就是失配函数,失配函数怎么得到,是通过模式串自己匹配自己得到。

地推 f[i+1] ,如果 i+1 失配,那么先看前一个数字,他是否适合,不适合,继续向前。

本题:

应用 f,如果字符串周期,那么 他的最短循环节 可以通过 f 得到。

f[i] : 根据定义, 前缀 和后缀的最长公共长度,那么 i - f[i] 就是最短循环节。

需要注意的是,i+1,!!!(自己体会)

 #include <cstdio>
#include <algorithm> using namespace std; const int maxn = + ;
char P[maxn];
int f[maxn]; int main()
{
int n,kase = ;
while(scanf("%d",&n),n) {
scanf("%s",P);
f[] = ;f[] = ;
for(int i=;i<n;i++) {
int j = f[i];
while(j&&P[i]!=P[j])
j = f[j];
f[i+] = (P[i] == P[j] ? j+:);
} printf("Test case #%d\n",kase++);
for(int i=;i<=n;i++) {
if(f[i]>&&i%(i-f[i])==)
printf("%d %d\n",i,i/(i-f[i]));
}
puts(""); }
return ;
}

最新文章

  1. JavaScript易错知识点整理
  2. ArrayIndexOutOfBoundsException
  3. Java笔记:修饰符
  4. CSS3参考手册
  5. Slow HTTP Denial of Service Attack
  6. javascript的关于刷新页面给出提示框的代码
  7. SCALA常规练习B
  8. banana pro 板子
  9. 使用EMOJI表情
  10. [转]java-Three Rules for Effective Exception Handling
  11. Eclipse用法和技巧十五:自动添加未实现方法1
  12. Java Concurrency (1)
  13. JavaScript中的DOM函数与关键字汇总
  14. Android OnLowMemory和OnTrimMemory
  15. bestcoder round 74 div2
  16. 使用whistle模拟cgi接口异常:错误码、502、慢网速、超时
  17. V8 下的垃圾回收机制
  18. SQLSERVER文件组误脱机后如何联机
  19. Day18 (二)反射
  20. NodeJS让前端与后端更友好的分手

热门文章

  1. 一步步带你做vue后台管理框架
  2. 单元测试框架AndroidTestCase
  3. android AIDL服务
  4. mysql limit查询(分页查询)探究
  5. bzoj 5291: [Bjoi2018]链上二次求和
  6. C#委托的好处
  7. DataRow获取数值类型为空或NULL时异常处理
  8. ThreadPoolExecutor(上篇)
  9. 【Linux】安装配置Tomcat7
  10. Lucene 初识