KMP——Period

2024-08-25 08:58
文章标签 kmp period

本文主要是介绍KMP——Period,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Period

Time Limit: 1000MS Memory limit: 65536K

题目描述

For each prefix of a given string S with N characters (each character has an
ASCII code between 97 and 126, inclusive), we want to know whether the prefix
is a periodic string. That is, for each i (2 ≤ i ≤ N) we want to know the largest K
> 1 (if there is one) such that the prefix of S with length i can be written as AK ,
that is A concatenated K times, for some string A. Of course, we also want to
know the period K.

输入

The input file consists of several test cases. Each test case consists of two
lines. The first one contains N (2 <= N <= 1 000 000) – the size of the string S.
The second line contains the string S. The input file ends with a line, having the
number zero on it.

输出

For each test case, output “Test case #” and the consecutive test case
number on a single line; then, for each prefix with length i that has a period K >
1, output the prefix size i and the period K separated by a single space; the
prefix sizes must be in increasing order. Print a blank line after each test case.

示例输入

3
aaa
12
aabaabaabaab
0

示例输出

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

提示

这道题目是KMP问题,求得是字串的个数和位置, 可以利用求next值来计算,如图所示,而i - j就是最小字串的长度,i指示当前母串的长度,只要i能对j整除,则除数就是字串的相同个数。
求自身的next值,当i与j匹配的时候,i和j前移,移动之后的i所对应的next值是j,代表了在该元素前面前缀等于后缀的最大长度为j,而j又是从0开始增长的,也就是从第一个元素算起,要计算循环的字符串,用i-j代表了j所代表的字符串的第一个字符对应的i所代表的字符串的前边的字符数目,也就是一个循环节的长度,在用i总长度去除单位长度,就会得到循环的次数。而确定一段字符串是循环节的条件就是i的长度是循环节的整倍数,并且不是本身自己(即i/(i-j) > 1)。


#include <stdio.h>
#include <string.h>
#include <stdlib.h>char st[1000009];
char st1[1000009];
int next[1000009];
int main()
{int i,j,l,n,x,y,m,a,b;l = 0;while(scanf("%d",&n)&&n){l++;scanf("%s",st);printf("Test case #%d\n",l);i = 0;j = -1;next[0] = -1;while(i<n){if(j == -1 || st[i] == st[j]){i++;j++;if(i%(i-j) == 0 && i/(i-j) >1)printf("%d %d\n",i,i/(i-j));next[i] = j;}elsej = next[j];}printf("\n");}return 0;
}


这篇关于KMP——Period的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1105110

相关文章

codeforces535D:Tavas and Malekas(KMP)

(i-1 , i)有重合的时候 ,从第i位开始的子串必须是模式串的前缀。 而同时,从第i位开始的子串本来就已经是模式串的后缀了。 typedef long long LL ;const int maxn = 1000008 ;int next[maxn] ;void getnext(char s[]){int len = strlen(s) ;next[0] = -1 ;i

fzu 2275 Game KMP

Problem 2275 Game Time Limit: 1000 mSec    Memory Limit : 262144 KB  Problem Description Alice and Bob is playing a game. Each of them has a number. Alice’s number is A, and Bob’s number i

jmeter线程组的ramp-up period 设置

Ramp-Up period(in seconds):用于告知JMeter 要在多长时间内建立全部的线程。默认值是0。如果未指定ramp-up period ,也就是说ramp-up period 为零, JMeter 将立即建立所有线程,假设ramp-up period 设置成1秒, 全部线程数设置成2个, JMeter 将每隔0.5秒建立一个线程(即ramp-up period时间内执行完所有

KMP 详解

KMP数组存的是什么 对于一个字符串 b,下标从1开始。 则kmp[i]表示 以i结尾的连续子串 = s的前缀的最大值(等价于前缀最大结尾处) 如何求KMP 假设 i 以前的KMP都被求出来了。 j 表示上一个字符可以成功匹配的长度(等价于下标) 如果b[j+1] != b[i]下一个位置匹配不上(即不能成为前缀) 则,让j = kmp[j] 即成为以j结尾的 连续子串 的 最长前缀

KMP算法详解 --- 彻头彻尾理解KMP算法

前言     之前对kmp算法虽然了解它的原理,即求出P0···Pi的最大相同前后缀长度k。   但是问题在于如何求出这个最大前后缀长度呢?   我觉得网上很多帖子都说的不是很清楚,总感觉没有把那层纸戳破,   后来翻看算法导论32章 字符串匹配,虽然讲到了对前后缀计算的正确性,但是大量的推理证明不大好理解,没有与程序结合起来讲。   今天我在这里讲一讲我的一些理解,希望大家多多指教

扩展KMP --- HDU 3613 Best Reward

Best Reward Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3613   Mean:  给你一个字符串,每个字符都有一个权值(可能为负),你需要将这个字符串分成两个子串,使得这两个子串的价值之和最大。一个子串价值的计算方法:如果这个子串是回文串,那么价值就是这个子串所有字符权值之和;否则价值为0。

数据结构串的实现以及KMP改进算法

</pre><pre name="code" class="cpp">#include <stdio.h>#include <stdlib.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXSIZE 40 /* 存储空间初始分配量 */typedef int Status; /* Status是

字符串匹配算法之KMP算法和BM算法

[尊重原创]-原文链接在这里->http://blogread.cn/it/article/3975?f=wb 本文主要介绍KMP算法和BM算法,它们分别是前缀匹配和后缀匹配的经典算法。所谓前缀匹配是指:模式串和母串的比较从左到右,模式串的移动也是从左到右;所谓后缀匹配是指:模式串和母串的的比较从右到左,模式串的移动从左到右。看得出来前缀匹配和后缀匹配的区别就仅仅在于比较的顺序不同。下文分别

KMP算法 KMP模式匹配 二(串)

B - KMP模式匹配 二(串) Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu Description 输入一个主串和一个子串,用KMP进行匹配,问进行几趟匹配才成功,若没成功,则输出0

HDU 1358(kmp)

题意:给出一个数字n,接下来一行是一个字符串,n是这个字符串的长度。求这个字符串的所有是循环字符串的前缀。 kmp中的next数组只得是第i个字符匹配错误,向前跳的位置next【i】。   #include<algorithm>#include<stdio.h>#include<string>#include<string.h>#include<math.h>#include<qu