首页 > 代码库 > Period
Period
uvalive3026:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1027
题解:给你一个串,然后让你找出前缀中是周期串的位子以及循环的次数。
题解:刚接触KMP,知道了KMP中的next数组可以解决这个问题。对一个串来说,如果这个串是周期串。那么,i-next[i]就是该串的循环节,反之亦然。即,(i-next[i])*k=i;
则,该串是周期串。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int N=1e7+8; 7 char p[N]; 8 int f[N]; 9 int main(){10 int n,kase=0;11 while(~scanf("%d",&n)&&n){12 scanf("%s",p);13 printf("Test case #%d\n",++kase);14 f[0]=0;f[1]=0;15 for(int i=1;i<n;i++){16 int j=f[i];17 while(j&&p[i]!=p[j])j=f[j];18 f[i+1]=(p[i]==p[j]?j+1:0);19 //printf("*%d ",f[i]);20 }21 for(int i=1;i<=n;i++){22 if(f[i]>0&&i%(i-f[i])==0) printf("%d %d\n",i,i/(i-f[i]));23 }24 printf("\n");25 }26 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。