| ||||||||||
| 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 | |||||||||
请教这个题用倍增算法有什么要注意的地方吗?我将各个sa和rank数组存放在一个二维数组里,总是超时。下面是我的代码。
#define NUM 100010
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int sa[20][NUM<<1],rank[20][NUM<<1],curlv,curlen;
int h[NUM<<1],height[NUM<<1];
char str[NUM*2+10];
int cmp(const void* a,const void* b)
{
if(curlv==0)
return str[*(int*)a]-str[*(int*)b];
else if(rank[curlv-1][*(int*)a]==rank[curlv-1][*(int*)b])
return rank[curlv-1][(*(int*)a)+curlen/2] - rank[curlv-1][(*(int*)b)+curlen/2];
else
return rank[curlv-1][*(int*)a] - rank[curlv-1][*(int*)b];
}
bool isequal(int clv,int cln,int p1,int p2)
{
if(clv==0)
return str[p1]==str[p2];
if(rank[clv-1][p1]==rank[clv-1][p2]&&
rank[clv-1][p1+cln/2]==rank[clv-1][p2+cln/2])
return true;
return false;
}
void getsa()
{
int i,r,len=strlen(str+1);
for(curlv=0,curlen=1;curlen<len;++curlv,curlen*=2)
{
for(i=1;i<=len;++i) sa[curlv][i]=i;
qsort(sa[curlv]+1,len,sizeof(int),cmp);
rank[curlv][sa[curlv][1]]=1;r=1;
for(i=2;i<=len;++i)
{
if(!isequal(curlv,curlen,sa[curlv][i],sa[curlv][i-1]))
++r;
rank[curlv][sa[curlv][i]]=r;
}
}
}
int main()
{
scanf("%s",str+1);
int len=strlen(str+1),i;str[len+1]=1;
scanf("%s",str+len+2);
int left=len;
len=strlen(str+1);
getsa();
for(i=1;i<=len;++i)
{
int j;
int a=i;
int b=sa[curlv-1][rank[curlv-1][i]-1];
if(rank[curlv-1][i]==1) h[i]=0;
else if(i==1||h[i-1]<=1)
{
for(j=0;str[a+j]==str[b+j];++j);
h[i]=j;
}
else
{
for(j=h[i-1]-1;str[a+j]==str[b+j];++j);
h[i]=j;
}
}
for(i=1;i<=len;++i)
height[i]=h[sa[curlv-1][i]];
int ans=0;
for(i=2;i<=len;++i)
{
if(sa[curlv-1][i]<=left&&sa[curlv-1][i-1]>left || sa[curlv-1][i]>left&&sa[curlv-1][i-1]<=left)
if(height[i]>ans) ans=height[i];
}
printf("%d\n",ans);
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator