問題 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;
}