\(最小循环节\) \(=\) \(lenghth - next[lenghth]\) #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #define R(a,b,c) for(register int a = (b); a <= (c); ++ a) #define nR(a,b,c) for(re…
题目描述 给你一个字符串,它是由某个字符串不断自我连接形成的. 但是这个字符串是不确定的,现在只想知道它的最短长度是多少. 输入输出格式 输入格式: 第一行给出字符串的长度,1 < L ≤ 1,000,000. 第二行给出一个字符串,全由小写字母组成. 输出格式: 输出最短的长度 输入输出样例 输入样例#1: 8 cabcabca 输出样例#1:3 说明 对于样例,我们可以利用"abc"不断自我连接得到"abcabcabc",读入的cabcabca,是它的子串…
P4391 [BOI2009]Radio Transmission 无线传输 kmp 题目让我们求一个串的最小循环子串 我们回想一下kmp中的失配函数 用 f 数组保存当前字符匹配失败后,需要跳到的前一个匹配字符 而题目说主串是某个子串不断自我连接形成 那么从 子串(长度设为 i )结束的后一个字符开始(i+1), f 数组会递增,每次+1(可以输出看看) 到 f[ n ] 时其实就增加了 n-i 次, f[ n ]=n-i 所以答案即为 n-f[ n ] end. #include<iostr…
原题传送门 这题需要用到kmp匹配 推导发现: 设循环节的长度为x,那么kmp数组前x个都是0,后面kmp[x+n]=n 先求出kmp数组 答案实际就是len-kmp[len] #include <bits/stdc++.h> #define N 1000005 using namespace std; char a[N]; int kmp[N]; int main() { int n; scanf("%d%s",&n,a); kmp[0]=kmp[1]=0; fo…
洛谷P4391:https://www.luogu.org/problemnew/show/P4391 思路 对于给定的字符串 运用KMP思想 设P[x]为前x个字符前缀和后缀相同的最长长度 则对于题目中的长度len有: len-p[len]为第一个重复子串的最后一个字符位置 因此len-p[len]即重复子串长度 证明: 因为p[len]为前len个字符中前缀和后缀相同的最长长度 先对于一个重复串来观察 abcd abcd abcd 则对于p[12]=8 就是它后面多出来的重复串 用总长把多出…
题目传送 假如我们有一个用于循环连接的最短串ans,考虑用它造出来的数据(即输入的字符串s)有什么特点.发现:ans自我连接出一个大串z后从中取出的一个子串即为s,对s造一个KMP算法中的next数组,n-next[n]即为ans的长度(n为字符串s的长度). 为什么?因为ans在s串中开头的那个字母一定会多次作为ans中的同一部分(或说同一位置)出现(否则s串就要比ans还要短(自己从纸上写个串就知道了),那么它自己就比ans更优(更短)了(这时让s串自己作为答案都要比让ans作为答案更优),…
题目描述 给你一个字符串,它是由某个字符串不断自我连接形成的. 但是这个字符串是不确定的,现在只想知道它的最短长度是多少. 输入输出格式 输入格式: 第一行给出字符串的长度,1 < L ≤ 1,000,000. 第二行给出一个字符串,全由小写字母组成. 输出格式: 输出最短的长度 输入输出样例 输入样例#1: 8 cabcabca 输出样例#1: 3 说明 对于样例,我们可以利用"abc"不断自我连接得到"abcabcabc",读入的cabcabca,是它的子…
(https://www.luogu.org/problemnew/show/P4391) 题目描述 给你一个字符串,它是由某个字符串不断自我连接形成的. 但是这个字符串是不确定的,现在只想知道它的最短长度是多少. 输入输出格式 输入格式: 第一行给出字符串的长度,1 < L ≤ 1,000,000. 第二行给出一个字符串,全由小写字母组成. 输出格式: 输出最短的长度 输入输出样例 输入样例#1: 复制 8 cabcabca 输出样例#1: 复制 3 说明 对于样例,我们可以利用"abc…
题目传送门 解题思路: 本题所要求的循环节,其实就是最长公共前缀的前缀长度减去前后缀重叠的一部分 AC代码: #include<iostream> #include<cstdio> using namespace std; ]; string l,p; int main() { scanf("%d",&n); l = " "; cin >> p; l += p; next[] = ; ;i <= n; i++) {…
题目描述 原题来自:BalticOI 2009 给你一个字符串,它是由某个字符串不断自我连接形成的.但是这个字符串是不确定的,现在只想知道它的最短长度是多少. 输入格式 第一行给出字符串的长度 L,第二行给出一个字符串,全由小写字母组成. 输出格式 输出最短的长度. 样例 样例输入 1 8 cabcabca 样例输出 1 3 样例说明 对于样例,我们可以利用 abc 不断自我连接得到 abcabcabc,读入的 cabcabca 是它的子串. 数据范围与提示 对于全部数据,1≤L≤10^6. 题…