Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
用后缀数组做的(自己弄了很多测试数数据都没有问题),wa了无数次,哪位牛人帮我看看啊(内有代码),给点测试数据也可以啊!!!!#include<stdio.h> #include<iostream> #include<algorithm> using namespace std; #define Max 20005 int s[Max],sa[Max],suffix[2][Max],rank1[2][Max],*sk1,*sk2,*rk1,*rk2; int h[Max],height[Max]; int n,k; /* int cmp(int a,int b) { return s[a]<s[b]; } int cmp1(int a,int b) { if(rk1[a]<rk1[b]) return 1; if(rk1[a]>rk1[b]) return 0; return rk1[a+k]<=rk1[b+k]; // rk1[a]==rk1[b] }*/ int cmp(const void *a,const void *b) { return s[*(int*)a]-s[*(int*)b]; } int cmp1(const void *a,const void *b) { if(rk1[*(int*)a]<rk1[*(int*)b]) return -1; if(rk1[*(int*)a]>rk1[*(int*)b]) return 1; return rk1[(*(int*)a)+k]-rk1[(*(int*)b)+k]; // rk1[a]==rk1[b] } int equal1(int ii,int i) { if(rk1[ii]==rk1[i] && rk1[ii+k]==rk1[i+k]) return 1; return 0; } int check(int num,int len) { int sum=0,i,flage=0; for(i=1;i<=n;i++) //&& n-i+1+sum>=len { while( i<=n && height[i]>=len) { flage=1; sum++; i++; } if(flage) { sum++,flage=0; } if(sum>=num) return 1; } return 0; } int b_f(int num,int r) { int l=1,mid,temp; while(l<=r) { mid=(l+r)>>1; temp=check(num,mid); if(temp) l=mid+1; else r=mid-1; } return r; } int main() { int i, *tempp,front,j,kk; while(scanf("%d%d",&n,&kk)!=EOF) { memset(suffix,0,sizeof(suffix)); memset(rank1,0,sizeof(rank1)); memset(h,0,sizeof(h)); sk1=suffix[0],sk2=suffix[1]; rk1=rank1[0],rk2=rank1[1]; for(i=1;i<=n;i++) scanf("%d",&s[i]); s[++n]=-1; for(i=1;i<=n;i++) sk1[i]=i; // sort(sk1,sk1+n+1,cmp); qsort(sk1+1,n,sizeof(int),cmp); for ( i = 1, j = 1; i<=n; i++) { if (i>1 && s[sk1[i]]!=s[sk1[i-1]]) j++; rk1[sk1[i]] = j; } for(i=1;i<=n;i++) sk2[i]=i; for(k=1;rk1[ sk1[n] ]<n;k=k*2) /// rk1[ sk1[n] ]<n 最后一名的排名>=n时表明已经求出 { // sort(sk2+1,sk2+n+1,cmp1); qsort(sk2+1,n,sizeof(int),cmp1); for ( i = 1, j = 1; i<=n; i++) { if (i>1 && !equal1(sk2[i],sk2[i-1]) ) j++; rk2[sk2[i]] = j; } tempp=sk1,sk1=sk2,sk2=tempp; tempp=rk1,rk1=rk2,rk2=tempp; } for(i=1;i<=n;i++) { if(rk1[i]==1) h[i]=0; else { if(i==1 || h[i-1]<=1) j=i,front=sk1[ rk1[i]-1 ]; // front (排名在 前面的串 的起始位置) else j=i+h[i-1]-1,front=sk1[ rk1[i]-1 ]+h[i-1]-1; // for( ;j<=n&& front<=n;j++,front++) if(s[front]!=s[j]) break; h[i]=j-i; // 有三种情况 1:j和front都小于等于n 2: j超出n 3:front超出n } } for(i=1;i<=n;i++) height[rk1[i]]=h[i]; /* for(i=1;i<=n;i++) { for(front=sk1[i];front<=n;front++) printf("%d ",s[front]); printf("\n"); } for(i=1;i<=n;i++) printf("%d ",height[i]); printf("height\n"); */ if(n==1) printf("1\n"); else printf("%d\n",b_f(kk,n)); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator