BZOJ 1355[Baltic2009]Radio Transmission(KMP)

题意

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

(n<=1000000)

题解

这种求最小循环节的题一般是KMP。

因为有一个很强的结论if(len%(len-nxt[len])==0)那这个字符串的最小环节为len-nxt[len]。

又因为题目说明给出的是有循环节的,所以直接输出len-nxt[len]就行了。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<cstdio>
 5 #include<algorithm>
 6 using namespace std;
 7 const int N=1001000;
 8 int n,nxt[N];
 9 char s[N];
10 int main(){
11     scanf("%d",&n);
12     scanf("%s",s+1);
13     nxt[1]=0;
14     for(int i=2,j=0;i<=n;i++){
15         while(j&&s[j+1]!=s[i])j=nxt[j];
16         if(s[j+1]==s[i])j++;
17         nxt[i]=j;
18     }
19     printf("%d",n-nxt[n]);
20     return 0;
21 }

 

posted @ 2018-08-24 15:54  Xu-daxia  阅读(119)  评论(0编辑  收藏  举报