BZOJ1355: [Baltic2009]Radio Transmission

易水人去,明月如霜。

Description

給你一個字符串,它是由某個字符串不斷自我連接形成的。但是這個字符串是不確定的,現在只想知道它的最短長度是多少.

Input

第一行給出字符串的長度,1 < L ≤ 1,000,000.第二行給出一個字符串,全由小寫字母組成.

Output

輸出最短的長度
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
char a[1000005];
int nxt[1000005];
int main()
{
    int n;
    scanf("%d",&n);
    char ph;
    //scanf("%c",&ph);
 scanf("%s",a+1);
 int len=strlen(a+1);
 int j=0;
 for(int i=2;i<=n;i++)
 {
     while(j!=0&&a[i]!=a[j+1]) j=nxt[j];
     if(a[i]==a[j+1]) j++;
     nxt[i]=j;
 }
 printf("%d\n",n-nxt[n]);
 return 0;
}

Sample Input

8
cabcabca

Sample Output

3

HINT

對於樣例,我們可以利用"abc"不斷自我連接得到"abcabcabc",讀入的cabcabca,是它的子串


思路:

KMP


代碼:



發佈了105 篇原創文章 · 獲贊 10 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章