标签:style os io for ar 代码 amp 算法
题意:给你一个字符串的长度及该字符串,要你求出该字符串从第一个元素开始到第j个元素,如果存在周期,则输出这个元素的位置及它有几个周期。
思路:一般的思路不介绍了,肯定超时。我们可以想到KMP算法中貌似有这样的记录前进多少位的next数组。那么当我们所前进的位数能被你所在位置整除的时候,不是正好说明了你的周期跟你所经历的周期数吗?
所以AC代码:
#include<cstdio> #include<cstring> #include<stdlib.h> #include<iostream> using namespace std; #define maxn 1000005 char p[maxn]; int next[maxn]; int n; void GetNext() { next[0] = -1; int k=-1; int j=0; while(j<n) { if (k==-1||p[j]==p[k]) { ++k; ++j; next[j]=k; } else { k=next[k]; } } } int main() { int i,j,cnt=1; while(scanf("%d",&n)!=EOF) { if(n==0)break; scanf("%s",p); GetNext(); //求next数组 printf("Test case #%d\n",cnt++); for(i=2;i<=n;i++) { j=i-next[i]; if(i%j==0&&i/j>1) //周期如果为1的话就没意义了 { printf("%d %d\n",i,i/j); } } printf("\n"); } return 0; }
HDU 1358 Period,布布扣,bubuko.com
标签:style os io for ar 代码 amp 算法
原文地址:http://blog.csdn.net/u012313382/article/details/38518135