Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

ozy

Posted by 200815147 at 2016-05-25 21:04:15 on Problem 1743
#include<cstdio>
#include<cstring>
#define maxn 20000
int n,m;
int wr[maxn],rank[maxn],a[maxn],height[maxn],sa[maxn],sort[maxn],y[maxn];
void init(int n)
{
  memset(rank,0,sizeof(rank));
  memset(a,0,sizeof(a));
  memset(sa,0,sizeof(sa));  
  int i,k,p;
  scanf("%d",&p);
  for(i=1;i<n;i++) 
  {
  	  scanf("%d",&k);
      a[i]=k-p+100;
      p=k;
  }
}
bool cmp(int x,int y,int z)
{
	if(wr[x+z]==wr[y+z] && wr[x]==wr[y]) return true;
	return false;
}
void get_sa(int n,int m)
{
	int i;
	for(i=1;i<=n;i++) rank[i]=a[i];
	for(i=0;i<=m;i++) sort[i]=0;
	for(i=1;i<=n;i++) sort[a[i]]++;
	for(i=1;i<=m;i++) sort[i]+=sort[i-1];
	for(i=n;i>=1;i--) sa[sort[a[i]]--]=i;
	int ln=1,p=0;
	while(ln<n)
	{
		int k=0;
		for(i=n-ln+1;i<=n;i++) y[++k]=i;
		for(i=1;i<=n;i++) if(sa[i]>ln) y[++k]=sa[i]-ln;
		for(i=1;i<=n;i++) wr[i]=rank[y[i]];
		for(i=0;i<=m;i++) sort[i]=0;
		for(i=1;i<=n;i++) sort[wr[i]]++;
		for(i=1;i<=m;i++) sort[i]+=sort[i-1];
		for(i=n;i>=1;i--) sa[sort[wr[i]]--]=y[i];
		for(i=1;i<=n;i++) wr[i]=rank[i];
		rank[sa[1]]=1;p=1;
		for(int i=2;i<=n;i++)
		{
			if(cmp(sa[i-1],sa[i],ln)==false) p++;
			rank[sa[i]]=p; 
		}
		m=p;ln*=2;
	}
}
void get_height(int n)
{
	int i,j,k=0;
	for(i=1;i<=n;i++)
	{
		j=sa[rank[i]-1];
		if(k>0) k--;
		while(a[i+k]==a[j+k]) k++;
		height[rank[i]]=k;
	}
}
bool check(int n,int k)
{
  int i,maxx=sa[1],minn=sa[1];
  for(i=2;i<=n;i++)
  {
    if (height[i]<k) maxx=minn=sa[i];
      else
      {
        if (sa[i]<minn) minn=sa[i];
        if (sa[i]>maxx) maxx=sa[i];
        if (maxx-minn>k) return true;
      }
  }
  return false;
}
void work(int n)
{
  int l,r,mid,ans;
  l=1;r=n;
  while(l<=r)
  {
    mid=(l+r)/2;
    if(check(n,mid)==true)
    {
      ans=mid;
      l=mid+1;
    }
	else r=mid-1;
  }
  if(ans>=4) printf("%d\n",ans+1);
  else printf("0\n");
}
int main()
{
	while(1)
	{
		scanf("%d",&n);
		if(n==0) break;
		init(n);
		get_sa(n-1,200);
		get_height(n-1);
		work(n-1);
	}
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator