【next数组应用】HDU 1358 Period
2014-08-22 23:00
393 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358
题目大意:给定字符串S,对于每个i(2<=i<=N),求最大的K值使A^K==S前i个字符,A^K为字符串A重复K次(只输出K>1的情况)
利用next数组可求出每个前缀的K值,详见:http://blog.csdn.net/f_xuan/article/details/38763127
#include<cstdio>
#include<cstring>
char str[1000100];
int next[1000100];
void get_next(int len){
int i=0,j=-1;
next[0]=-1;
while(i<len){
if(j==-1||str[i]==str[j]){
i++,j++;
next[i]=j;
}else
j=next[j];
}
}
int main(){
int i,ans,len;
int cas=1;
while(~scanf("%d",&len)&&len){
scanf("%s",str);
get_next(len);
printf("Test case #%d\n",cas++);
for(i=2;i<=len;++i){
if((i%(i-next[i])==0)&&i/(i-next[i])>1){
printf("%d %d\n",i,i/(i-next[i]));
}
}
printf("\n");
}
return 0;
}
题目大意:给定字符串S,对于每个i(2<=i<=N),求最大的K值使A^K==S前i个字符,A^K为字符串A重复K次(只输出K>1的情况)
利用next数组可求出每个前缀的K值,详见:http://blog.csdn.net/f_xuan/article/details/38763127
#include<cstdio>
#include<cstring>
char str[1000100];
int next[1000100];
void get_next(int len){
int i=0,j=-1;
next[0]=-1;
while(i<len){
if(j==-1||str[i]==str[j]){
i++,j++;
next[i]=j;
}else
j=next[j];
}
}
int main(){
int i,ans,len;
int cas=1;
while(~scanf("%d",&len)&&len){
scanf("%s",str);
get_next(len);
printf("Test case #%d\n",cas++);
for(i=2;i<=len;++i){
if((i%(i-next[i])==0)&&i/(i-next[i])>1){
printf("%d %d\n",i,i/(i-next[i]));
}
}
printf("\n");
}
return 0;
}
相关文章推荐
- hdu 1358 Period(KMP之next数组)
- hdu 1358 Period(KMP之next数组)
- hdu 1358 Period(KMP之next数组)
- HDU 1358 Period(next数组+周期+循环节)
- hdu1358 KMP中next数组的应用
- hdu 1358 Period(KMP之next数组)
- hdu 1358 Period(KMP之next数组)
- HDU - 1358 Period(KMP next数组)
- hdu 1358 Period(KMP之next数组)
- hdu-1358 kmp,next数组的应用
- hdu 1358:Period(KMP算法,next[]数组的使用)
- (KMP 1.5)hdu 1358 Period(使用next数组来求最小循环节——求到第i个字符的循环节数)
- HDOJ1358 Period 【KMP next数组应用】
- HDu 1358 Period(Next 数组找循环节)
- hdu 1358 Period(KMP之next数组)
- hdu 1358 Period(KMP之next数组)
- hdu 1358 Period(KMP之next数组)
- hdu 1358 Period(KMP之next数组)
- HDU 1358 Period(KMP+next数组的运用)
- hdu 1358 Period(KMP之next数组)