zoj3395后缀树组-2

 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3971

题意:求一个数组中重复出现至少m次的最长字串。。。

分析:二分答案进行判断即可。。对每个判断的长度,只需要看连续在这段里面的height>=mid的个数是不是>=m-1即可。。

ps:本题刷到rank1了,呵呵。。

关键代码:240ms

void print(int mid)
{
	int i, j, mx, right=-1;
	for(i=1; i<=len; )
	{
		while(i<=len && height[i]<mid)
			i++;
		j=i;
		mx = 0;
		if(sa[i-1]>mx)
			mx = sa[i-1];
		while(j<=len && height[j]>=mid)
		{
			if(sa[j]>mx)
				mx = sa[j];
			j++;
		}
		if(j-i>=m-1)
		{
			if(mx>right)
				right = mx;
		}
		i = j;
	}
	printf("%d %d\n", mid, right);
}

int main()
{
	int i, l, r, mid, ans;
	while(scanf("%d", &m)!=EOF)
	{
		if(m==0)
			break;
		//scanf("%s", s);
		gets(s);
		gets(s);
		len = strlen(s);
		if(m==1)
		{
			printf("%d 0\n", len);
			continue;
		}
		for(i=0; i<len; i++)
			a[i] = s[i]-'a'+1;
		a[len] = 0;
		dc3(a, sa, len+1, 28);
		calheight(a, sa, len);
		l=0, r=len-1;
		while(l<=r)
		{
			mid = (l+r)>>1;
			if(check(mid))
				l = mid+1;
			else
				r = mid-1;
		}
		ans = r;
		if(ans==0)
			printf("none\n");
		else
			print(ans);
	}

	return 0;
}


 

猜你喜欢

转载自blog.csdn.net/ggggiqnypgjg/article/details/6732924