1355: [Baltic2009]Radio Transmission

来源:互联网 发布:成为院士 知乎 编辑:程序博客网 时间:2024/05/15 02:41

题目链接

题目大意:给你一个字符串,它是由某个字符串不断自我连接形成的长串的子串。 但是这个字符串是不确定的,现在只想知道它的最短长度是多少.

题解:根据next数组的性质,有
i%( i-next[i] )==0&&next[i] !=0 , 则说明字符串前i位循环,而且循环节长度为:i-next[i],循环次数为: i/( i-next[i])
因为不要求整除所以ans=n-next[n]

我的收获:get了next数组的循环性质,也加深了对kmp的理解

#include <iostream>#include <cstdio>using namespace std;const int M=1000005;int n,nex[M];char p[M];void get(){    for(int i=2,j=0;i<=n;i++){        while(j&&p[i]!=p[j+1]) j=nex[j];        if(p[i]==p[j+1]) j++;        nex[i]=j;    }}void work(){    printf("%d\n",n-nex[n]);}void init(){    cin>>n;scanf("%s",p+1);    get();}int main(){    init();    work();    return 0;}
0 0