| ||||||||||
| 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 | |||||||||
第一道后缀数组,留帖纪念#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
char s[500000+33];
int xh[200000+33];
int rank[200000+33],sa[200000+33],trank[200000+33],tsa[200000+33];
int h[200000+33];
int temp[200000+33];
int n,ans;
bool comp(int a,int b)
{return s[a]<s[b];}
int main()
{
scanf("%s",s+1);
int cut1=strlen(s+1);
s[cut1+1]='#';
scanf("%s",s+cut1+2);
int cut2=cut1+2;
n=strlen(s+1);
for (int i=1;i<=n;i++) xh[i]=i;
sort(xh+1,xh+n+1,comp);
int tmp=0;
for (int i=1;i<=n;i++)
if (s[xh[i]]!=s[xh[i-1]])
rank[xh[i]]=++tmp;
else rank[xh[i]]=tmp;
int ll=1;
for (;ll<=n;)
{
memset(temp,0,sizeof(temp));
for (int i=1;i<=n;i++) temp[rank[i+ll]]++;
for (int i=1;i<=n;i++) temp[i]+=temp[i-1];
for (int i=n;i>=1;i--) tsa[temp[rank[i+ll]]--]=i;
memset(temp,0,sizeof(temp));
for (int i=1;i<=n;i++) temp[rank[i]]++;
for (int i=1;i<=n;i++) temp[i]+=temp[i-1];
for (int i=n;i>=1;i--) sa[temp[rank[tsa[i]]]--]=tsa[i];
trank[sa[1]]=1;
for (int i=2;i<=n;i++)
if (rank[sa[i-1]]==rank[sa[i]]&&rank[sa[i-1]+ll]==rank[sa[i]+ll])
trank[sa[i]]=trank[sa[i-1]];
else trank[sa[i]]=trank[sa[i-1]]+1;
memcpy(rank,trank,sizeof(rank));
if (rank[sa[n]]==n) break;
ll=ll<<1;
}
int l=0;
for (int i=1;i<=n;i++)
{
l=max(0,l-1);
if (rank[i]>1)
{
int w=sa[rank[i]-1];
while (i+l<=n&&w+l<=n&&s[i+l]==s[w+l]) l++;
h[rank[i]]=l;
}
else h[rank[i]]=l=0;
}
for (int i=2;i<=n;i++)
if ((sa[i-1]<=cut1&&sa[i]>=cut2)||(sa[i-1]>=cut2&&sa[i]<=cut1))
ans=max(ans,h[i]);
printf("%d",ans);
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator