问题 L: 【KMP】Radio Transmission
时间限制: 1 Sec 内存限制: 128 MB
提交: 29 解决: 6
[提交] [状态] [讨论版] [命题人:admin]
题目描述
给你一个字符串,它是由某个字符串不断自我连接形成的。但是这个字符串是不确定的,现在只想知道它的最短长度是多少。
输入
第一行给出字符串的长度L,第二行给出一个字符串,全由小写字母组成。
输出
输出最短的长度。
样例输入
8 cabcabca
样例输出
3
提示
我们可以利用abc不断自我连接得到abcabcabc,读入的cabcabca是它的子串。
对于全部数据,1≤L≤106
对一个长度为l的字符串来说,next[l]记录的就是他最长的相同的前缀与后缀,也就是说有next[l]的长度是重复出现的,那么除去这个前缀以后,剩下的就是这个字符串最小的循环节了,即l-next[l]
#include <bits/stdc++.h>
using namespace std;
char str[1000005];
int nextt[1000005];
int l;
void getnext()
{
int k = -1;
int j = 0;
while (j < l)
{
if (k == -1 || str[j] == str[k])
{
j++;
k++;
nextt[j] = k;
}
else
k = nextt[k];
}
}
int main()
{
// freopen("in.txt", "r", stdin);
scanf("%d %s", &l, str);
memset(nextt, -1, sizeof(nextt));
getnext();
int minn = l - nextt[l];
printf("%d\n", minn);
return 0;
}