题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358
题目大意:给你一串字符串,判断字符串的前缀是否由某些字符串多次重复而构成。
也就是,从第1个字母到第2字母组成的字符串可由某一周期性的字串(“a”)
的两次组成,也就是aa有两个a组成;
第三行自然就是aabaab可有两个aab组成;
第四行aabaabaab可由三个aab组成;
第五行aabaabaabaab可由四个aab组成。
解题思路:同HDU 3746类似,通过计算字符串前缀的循环节获得相应周期即可。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int N=1e6+5; 7 8 int m; 9 int nxt[N]; 10 char p[N]; 11 12 void getnext(){ 13 int i,j; 14 i=0,j=nxt[0]=-1; 15 while(i<m){ 16 while(j!=-1&&p[i]!=p[j]) 17 j=nxt[j]; 18 nxt[++i]=++j; 19 } 20 } 21 22 int main(){ 23 int cas=0; 24 while(scanf("%d",&m)&&m){ 25 scanf("%s",p); 26 getnext(); 27 printf("Test case #%d ",++cas); 28 //枚举长度为2~m的字符串前缀 29 for(int i=2;i<=m;i++){ 30 int mmin=i-nxt[i]; //len-nxt[len]为最小循环节 31 if(i!=mmin&&i%mmin==0) 32 printf("%d %d ",i,i/mmin); 33 } 34 printf(" "); 35 } 36 return 0; 37 }