问题 L: 【KMP】Radio Transmission
时间限制: 1 Sec 内存限制: 128 MB提交: 34 解决: 7
[提交] [状态] [讨论版] [命题人:admin]
题目描述
给你一个字符串,它是由某个字符串不断自我连接形成的。但是这个字符串是不确定的,现在只想知道它的最短长度是多少。
输入
第一行给出字符串的长度L,第二行给出一个字符串,全由小写字母组成。
输出
输出最短的长度。
样例输入
8
cabcabca
样例输出
3
提示
我们可以利用abc不断自我连接得到abcabcabc,读入的cabcabca是它的子串。
对于全部数据,1≤L≤106
重点: n - next[n] 是kmp中常用的操作 当最后一位失配时必然跳转到最小循环节处,所以答案就是 n - nxt[n] 了。 (结论转自https://blog.csdn.net/HouRui2000/article/details/77103790)
举个栗子:c a b c a b c a
Next[] -1 0 0 0 1 2 3 4 5
n-next[n] 8-next[8] = 8-5 = 3 (最小循环节的长度)
代码:
#include <bits/stdc++.h> using namespace std; char p[1000005]; int lenp; int Next[1000005]; void get_next() { int i,j; Next[0] = j = -1; i = 0; while(i<lenp) { while(j!=-1&&p[j]!=p[i]) j = Next[j]; Next[++i] = ++j; } } int main() { int n; cin>>n; scanf("%s",p); lenp = strlen(p); get_next(); // for(int i=0;i<lenp;i++) // { // cout<<Next[i]<<" "; // } cout<<n-Next[n]; return 0; }