<​题目链接​>

题目大意:

意思是,从第1个字母到第2字母组成的字符串可由某一周期性的字串(“a”)

的两次组成,也就是aa有两个a组成;

第三行自然就是aabaab可有两个aab组成;

第四行aabaabaab可由三个aab组成;

第五行aabaabaabaab可有四个aab组成

解题分析:

求字符串的前缀是否为周期串,若是,打印循环节的长度及循环次数;

 



#include <cstdio>
#include <cstring>

const int M =1e6+100;
char s[M];
int nxt[M],n;
void getnext(){
int i=0,j=-1;
nxt[0]=-1;
while(i<n){
if(j==-1||s[i]==s[j])
nxt[++i]=++j;
else
j=nxt[j];
}
}
int main(){
int ncase=0;
while(scanf("%d",&n)!=EOF,n){
scanf("%s",s);
getnext();
printf("Test case #%d\n",++ncase);
for(int i=1;i<=n;i++){ //注意这里不能把n 写成strlen(s),会超时!!!
int len=i-nxt[i]; //len代表最小循环节
if(i%len==0&&i/len>1) // i/len代表循环次数
printf("%d %d\n",i,i/len);
}
printf("\n");
}
return 0;
}


 

 

2018-08-04