【KMP】Radio Transmission

问题 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;
}

 

 

posted @ 2018-09-14 16:21  zangzang  阅读(282)  评论(0编辑  收藏  举报