题意:
给你一个字符串,让你找出这个字符串的最大循环次数,及最小循环节。
题解:
用kmp的nxt数组搞搞,L=j-nxt[j],为前缀j的最小循环节。
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #define F(i,a,b) for(int i=(a);i<=(b);++i) 5 using namespace std; 6 7 void kmp_pre(char *x,int m,int *nxt){ 8 int i,j; 9 j=nxt[0]=-1,i=0; 10 while(i<m){ 11 while(-1!=j&&x[i]!=x[j])j=nxt[j]; 12 nxt[++i]=++j; 13 } 14 } 15 16 const int N=1e6+7; 17 char s[N]; 18 int nxt[N],n; 19 20 int main(){ 21 while(~scanf("%s",s)) 22 { 23 if(*s==‘.‘)break; 24 n=strlen(s); 25 kmp_pre(s,n,nxt); 26 int ans=1; 27 if(n%(n-nxt[n])==0)ans=n/(n-nxt[n]); 28 printf("%d\n",ans); 29 } 30 return 0; 31 }
时间: 2024-10-22 14:16:57