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 }