NEFU 1318 字符串的重复周期(KMP)

2024-04-09 13:08

本文主要是介绍NEFU 1318 字符串的重复周期(KMP),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

字符串的重复周期

Problem:1318
Time Limit:1000ms
Memory Limit:65535K

Description

给出字符串 S,求出串S的所有前缀中,是周期串的前缀的长度 Len 和他的最大重复周期 K

Input

多组样例。
对于每组样例
第一行输入串长 N (2<=N<=1e6)
第二行输入串 S
对于所有的S,长度和小于1e7

Output

对于S中是周期串的前缀
要求输出 K>1 的前缀的长度 Len 和最大重复周期 K 
每一个长度和周期用一个空格分开。

Sample Input

3
aaa
12
aabaabaabaab

Sample Output

2 2
3 3
2 2
6 2
9 3
12 4

Hint

对于第一组样例 3 aaa
对于前缀 'a'   Len = 1 ,K 最大为 1 不符合要求
对于前缀 'aa'  Len = 2 ,K 最大为 2 周期串为 'a'
对于前缀 'aaa' Len = 3 ,K 最大为 3 周期串为 'a'
对于第二组样例 12 aabaabaabaab
对于前缀 'aa'  	   	 Len = 2 ,K 最大为 2 周期串为 'a'
对于前缀 'aabaab'   	 Len = 6 ,K 最大为 2 周期串为 'aab'
对于前缀 'aabaabaab'     Len = 9 ,K 最大为 3 周期串为 'aab'
对于前缀 'aabaabaabaab'  Len = 12 ,K 最大为 4 周期串为 'aab'

Source

DT2131
题意:中文题。

思路:

用KMP求出Next数组。然后从前往后搜,对于每一个i来说,周期都为i+1-next[i]。当周期能整除长度并且前缀长度不为1的时候,那么就输出长度和最大重复周期。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char t[1000005];
int ne[1000005];
char p[1000005];
void makenext(const char p[],int ne[],int len)
{ne[0]=0;for(int i=1,k=0;i<len;i++){while(k>0&&p[i]!=p[k]) k=ne[k-1];if(p[i]==p[k]) k++;ne[i]=k;}
}
int main()
{int len;while(~scanf("%d",&len)){scanf("%s",t);makenext(t,ne,len);for(int i=0;i<len;i++){int zhouqi=i+1-ne[i];if((i+1)%zhouqi==0&&ne[i]!=0)printf("%d %d\n",i+1,(i+1)/zhouqi);}}return 0;
}


这篇关于NEFU 1318 字符串的重复周期(KMP)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

poj2406(连续重复子串)

题意:判断串s是不是str^n,求str的最大长度。 解题思路:kmp可解,后缀数组的倍增算法超时。next[i]表示在第i位匹配失败后,自动跳转到next[i],所以1到next[n]这个串 等于 n-next[n]+1到n这个串。 代码如下; #include<iostream>#include<algorithm>#include<stdio.h>#include<math.

poj3261(可重复k次的最长子串)

题意:可重复k次的最长子串 解题思路:求所有区间[x,x+k-1]中的最小值的最大值。求sa时间复杂度Nlog(N),求最值时间复杂度N*N,但实际复杂度很低。题目数据也比较水,不然估计过不了。 代码入下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring

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

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

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

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

C# 防止按钮botton重复“点击”的方法

在使用C#的按钮控件的时候,经常我们想如果出现了多次点击的时候只让其在执行的时候只响应一次。这个时候很多人可能会想到使用Enable=false, 但是实际情况是还是会被多次触发,因为C#采用的是消息队列机制,这个时候我们只需要在Enable = true 之前加一句 Application.DoEvents();就能达到防止重复点击的问题。 private void btnGenerateSh

C和指针:字符串

字符串、字符和字节 字符串基础 字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。 字符串长度就是字符串中字符数。 size_t strlen( char const *string ); string为指针常量(const修饰string),指向的string是常量不能修改。size_t是无符号数,定义在stddef.h。 #include <stddef.h>

PHP字符串全排列

方法一: $str = 'abc';$a =str_split($str);perm($a, 0, count($a)-1);function perm(&$ar, $k, $m) {if($k == $m){ echo join('',$ar), PHP_EOL;}else {for($i=$k; $i<=$m; $i++) {swap($ar[$k], $ar[$i]);perm($ar