hdu1358

/*
分析:
    KMP基础题。
    对next的理解更深入了点儿。
    字符编号从0开始,那么if(i%(i-next[i])==0),则i前面的
串为一个轮回串,其中轮回子串出现i/(i-next[i])次。
    想了快半个小时,终于想明白了TT,咱还是太水了囧~


                                                 2012-09-13
*/






#include"stdio.h"
#include"string.h"
char str[1000111];
int next[1000111];
void getnext()
{
	int j,k;
	memset(next,0,sizeof(next));
	j=0;
	k=-1;
	next[0]=-1;
	while(str[j])
	{
		if(k==-1 || str[j]==str[k])	next[++j]=++k;
		else						k=next[k];
	}
}
void KMP()
{
	int i;
	int t;
	for(i=2;str[i-1];i++)
	{
		t=i-next[i];
		if(i%t==0 && i/t>1)	printf("%d %d\n",i,i/t);
	}
}
int main()
{
	int Case=1;
	int n;
	while(scanf("%d",&n),n)
	{
		scanf("%s",str);
		printf("Test case #%d\n",Case++);
		getnext();
		KMP();
		printf("\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值