POJ 2406 Power Strings next数组循环节应用、
题意:就给出个字符串做*的定义、a^0 = "" (the empty string) and a^(n+1) = a*(a^n). 题目要求n的最大值、
思路: 化简上面的等式之后就知道是求a的n次方,也就是说求所给字符串的最大循环次数,想一想、 如果可以求出所给字符串的最小循环节, 那么是不是就可以求出它的最大循环次数了、 这是肯定的、 因为循环节最小、 循环次数也就最大
1 #include<iostream> 2 #include<cstring> 3 #include<cmath> 4 #include<cstdio> // 数组要开大一点、 5 const int qq=1000000+10; 6 char node[qq]; 7 int next[qq]; 8 int len; 9 void getnext() 10 { 11 int i,j; 12 i=0;j=-1; 13 next[0]=-1; 14 while(i<len){ 15 if(j==-1||node[i]==node[j]) 16 next[++i]=++j; 17 else 18 j=next[j]; 19 } 20 } 21 int main() 22 { 23 while(~scanf("%s",node)&&node[0]!='.'){ 24 len=strlen(node); 25 getnext(); 26 /*for(int i=0;i<=len;++i) 27 printf("%d ",next[i]); 28 printf("\n");*/ 29 printf("%d\n",len%(len-next[len])==0?len/(len-next[len]):1); 30 // len-next[len]得到的是最小循环节 31 } // 这题只能用判断是否可以整除、 32 return 0; 33 } 34 // 至于为什么不能用特判最后一个字符是否和循环节最后一个字符相等来判断 35 // 我也没想清楚、 而且len-next[len]得到的可能不是循环节的第一个字符