分类: C/C++
2011-05-01 11:51:55
硬是花了3天时间才看懂罗穗骞的论文,然后在去切最简单pku2774,结果杯具了,自己手写的倍增算法不是这里出问题就是那里搞错,最后不是wa就是re,郁闷。。。拉倒换了pku3581,还行总算ac了,接下来写写菜鸟的理解:
int cmp(int *r,int a,int b,int l)
{return r[a]==r[b]&&r[a+l]==r[b+l];}
这个比较函数就是根据第一关键字和第二关键字来确定当前长度为j*2的字符串排名,r数组记录上次长度为j的排名
void da(int *r,int *sa,int n,int m)
{
int i,j,p,*x=wa,*y=wb,*t;
for(i=0;i
for(j=1,p=1;p
for(p=0,i=n-j;i
for(i=0;i
for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i
}
return;
}
void calheight(int *r,int *sa,int n)
{
int i,j,k=0;
for(i=1;i<=n;i++) rank[sa[i]]=i;
for(i=0;i
return;
}
一系列字符串按从小到大的顺序排列,任意相邻的字符串都是从后缀开始发生改变,前缀一般保持不变,这样最长公共前缀一定存在于排名连续的几个字符串之间。