【KMP】Radio Transmission

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章