HDU 1358 Period (kmp求循环节)(经典)
<题目链接>
题目大意:
意思是,从第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
作者:is_ok
出处:http://www.cnblogs.com/00isok/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。