poj2406-求主串的周期子串

题目大意:给出一个字符串,将其分解为若干子串的和,求可分解的最多子串的个数。

做题之前就知道这是一道KMP的题目,但一直没想到怎么写  后面看了下别人的思路(最近写题总是会忍不住看别人的思路 惭愧。。)   得出结论: 一个串的周期子串长度=主串长-next[主串长度].  然后再用主串长除以周期子串长度就得到了子串周期长度。

下面贴代码

#include "iostream"
using namespace std;
#define len 1000020
char c[len];
int next[len];
int clen;
void getnext()
{
	int i;
	int j;
	i=0;
	j=-1;
	next[0]=-1;

	while (i<clen)
	{
		if (j==-1||c[i]==c[j])
		{
			i++;
			j++;
			next[i]=j;
		}
		else
		{
			
			j=next[j];
		}
	}
	
}

int main()
{
	while (true)
	{
		scanf("%s",c);
		if (c[0]=='.')
		{
			break;
		}
		clen=strlen(c);
		getnext();
		int t=clen-next[clen];
		if (c[clen-1]!=c[t-1])
		{
			printf("1\n");//注意考虑如aabaabaa 这种结果为1的情况
		}
		else
		{
			printf("%d\n",clen/(clen-next[clen]));
		}
	}
	
	return 0;
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值