题目描述

一个字符串的前缀是从第一个字符开始的连续若干个字符,例如”abaab”共有5个前缀,分别是a, ab, aba, abaa, abaab。

我们希望知道一个N位字符串S的前缀是否具有循环节。

换言之,对于每一个从头开始的长度为 i (i>1)的前缀,是否由重复出现的子串A组成,即 AAA…A (A重复出现K次,K>1)。

如果存在,请找出最短的循环节对应的K值(也就是这个前缀串的所有可能重复节中,最大的K值)。

输入格式

输入包括多组测试数据,每组测试数据包括两行。
第一行输入字符串S的长度N。
第二行输入字符串S。
输入数据以只包括一个0的行作为结尾。

输出格式

对于每组测试数据,第一行输出 “Test case #” 和测试数据的编号。
接下来的每一行,输出具有循环节的前缀的长度i和其对应K,中间用一个空格隔开。
前缀长度需要升序排列。
在每组测试数据的最后输出一个空行。

数据范围

2≤N≤1000000

输入样例:

3
aaa
4
abcd
12
aabaabaabaab
0

输出样例:

Test case #1
2 2
3 3
Test case #2

Test case #3
2 2
6 2
9 3
12 4

题解这道题考察的是Next[ i ]数组的性质:s[i ~ i]具有的长度为len < i 的循环元的充要条件是 len能整出 i 并且i - len是Next[i]的候选项,即len = i - Next[ i ]。
代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6;
int Next[N], n;
char s[N];
void get()
{for(int i = 2, j = 0; i <= n; i++){while(j && s[i] != s[j + 1])j = Next[j];if(s[i] == s[j + 1])j++;Next[i] = j;}
}
int main()
{int k = 1;while(scanf("%d", &n) && n){cin >> s + 1;get();printf("Test case #%d\n", k++);for(int i = 2; i <= n; i++){if(i % (i - Next[i]) == 0 && (i - Next[i]) != i)cout << i << ' ' << i / (i - Next[i]) << endl;}cout << endl;}return 0;
}

周期(KMP算法之Next数组的性质)相关推荐

  1. KMP算法的next数组通俗解释

    我们在一个母字符串中查找一个子字符串有很多方法.KMP是一种最常见的改进算法,它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,加快匹配速度. 当然我们可以看到这个算法针对的是子串有对称属性, ...

  2. KMP算法之NEXT数组代码原理分析 - 数据结构和算法38

    KMP算法之NEXT数组代码原理分析 让编程改变世界 Change the world by program KMP算法之NEXT数组代码原理分析 NEXT数组:当模式匹配串T失配的时候,NEXT数组 ...

  3. 数据结构与算法之KMP算法中Next数组代码原理分析

    2019独角兽企业重金招聘Python工程师标准>>> 一.KMP算法之Next数组代码原理分析       1.Next数组定义 当模式匹配串T失配的时候,Next数组对应的元素指 ...

  4. KMP算法及next数组(最大公共前后缀)求解

    KMP算法及next数组(最大公共前后缀)求解 2020.12.14理解: 1. KMP算法 网上关于KMP算法讲解较为简单易懂,因此在此只作简述: 在字符串s中匹配字符串t: S: ABE-AB-A ...

  5. KMP算法之next数组详解

    KMP算法之next数组详解 KMP算法实现原理 KMP算法是一种非常高效的字符串匹配算法,下面我们来讲解一下KMP算如何高效的实现字符串匹配.我们假设如下主串和模式串: int i;//i表示主串的 ...

  6. 看了这个你基本就会算kmp算法的next数组了

    看了这个你基本就会算kmp算法的next数组了 kmp算法的next数组求解在计算机专业考研中,以及在大学的数据结构考试中等场合可能会遇到,而遇到后,可能很多同学绕绕脑袋,抓抓头发,却发现还是做不来. ...

  7. KMP算法 → 计算next数组

    [KMP算法简介] KMP算法中的next数组仅取决于模式串本身,而与相匹配的主串无关. KMP算法中的next数组,是KMP算法的核心. KMP算法是由克努特(Knuth).莫里斯(Morris)和 ...

  8. KMP算法求回溯数组的步骤

    KMP算法到底是什么原理就不说了,各种资料上讲的明明白白,下面我就如何用代码来实现做一下说明和记录. KMP的核心思想就是,主串不回溯,只模式串回溯.而模式串匹配到第几位时失配,要回溯多少,由模式串本 ...

  9. 串的模式匹配、KMP算法、nextval数组求法

    一.暴力匹配 #include <iostream> using namespace std; #define MAXLEN 255 typedef struct{char ch[MAXL ...

最新文章

  1. 非著名架构师告诉你,代码该如何写,才能自己写的容易别人看的也不痛苦
  2. eNSP模拟器路由器无法正常启动一直显示“#”——问题解决方法
  3. 不能启动u盘 uefi_不知道怎么进入主板设置U盘启动,试试这些方式
  4. dedecms织梦模板|绿色仿下载吧网站织梦dede模板源码
  5. 20秋学期计算机应用基础在线作业3,电子科大16秋《计算机应用基础》在线作业3...
  6. PHP 字符串匹配算法 Sunday算法
  7. 【Spark调优】聚合操作数据倾斜解决方案
  8. 老罗将死,或者Android也将就换代,但是互联网的,共享,互助精神将永存
  9. 代码精进之代码规范(二)
  10. 帆软报表Tomcat 发布部署
  11. Camtasia2022电脑屏幕录像使用录屏教程
  12. 51单片机最小系统电路图
  13. 墨者安全调查:2018年DDoS威胁与黑灰产业调查报告
  14. 什么是光时域反射仪,OTDR的工作原理是什么
  15. 网站被攻击了怎么处理
  16. SQL查询按照特定规则排序
  17. Mysql数据恢复---闪回恢复
  18. 哪个国家程序员最多?不是美国和中国,是这个‘落后’的亚洲国家
  19. python对小数的特殊处理(个人需求-小数点后有一位保留,否则十分位进1)
  20. Frog Jumps

热门文章

  1. 下拉框数据绑定两种方式
  2. ubuntu下如何查看和设置分辨率 (转载)
  3. FLEX4中的Panel如何实现带自定义图标和按钮
  4. [转]很经典的http协议详解
  5. F#基础教程 ref类型
  6. 2010中小网站运营报告:社区论坛网站后来居上
  7. 2019 CCPC 秦皇岛F Forest Program(dfs)
  8. [转]WTL的windows mobile环境的配置(vs2008)[最终版,验证通过]
  9. vue中使用ts后,父组件获取执行子组件方法报错问题
  10. JavaScript中的match方法和search方法