您的位置:首页 > 其它

【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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  KMP next