您的位置:首页 > 其它

poj 2774

2011-03-10 16:31 190 查看
后缀数组

代码:

#include<iostream>
#include<fstream>

using namespace std;

int sa[200003],sa1[200003],rank1[200003];
int rank[200003],y[200003],h[200003];
int pow=1;
char m[200004];
int c[200003];

int cmp2(const void *a,const void *b){
int x=*(int*)a;
int y=*(int*)b;
if(rank[x]!=rank[y])
return(rank[x]-rank[y]);
else
return(rank[x+pow]-rank[y+pow]);
}

void creat(int n){
int i,j,t;
for(i=0;i<=256;i++)
c[i]=0;
for(i=0;i<n;i++)
c[m[i]]++;
for(i=1;i<=256;i++)
c[i]+=c[i-1];
for(i=n-1;i>=0;i--)
sa[--c[m[i]]]=i;
for(i=0,j=0;i<n;i++)
{
if(i>0&&m[sa[i]]!=m[sa[i-1]])
j++;
rank[sa[i]]=j;
}

for(pow=1;pow<n;pow*=2)
{
for(i=0;i<n;i++)
c[i]=0;
for(i=0;i<n;i++)
if(sa[i]+pow<n)
c[rank[sa[i]+pow]]++;
else
c[rank[sa[i]]]++;

for(i=1;i<n;i++)
c[i]+=c[i-1];
for(i=n-1;i>=0;i--)
if(sa[i]+pow<n)
sa1[--c[rank[sa[i]+pow]]]=sa[i];
else
sa1[--c[rank[sa[i]]]]=sa[i];
for(i=0;i<n;i++)
c[i]=0;
for(i=0;i<n;i++)
c[rank[sa1[i]]]++;
for(i=1;i<n;i++)
c[i]+=c[i-1];
for(i=n-1;i>=0;i--)
sa[--c[rank[sa1[i]]]]=sa1[i];
j=0;
for(i=0;i<n;i++)
{
if(i>0&&cmp2(&sa[i],&sa[i-1])!=0)
j++;
rank1[sa[i]]=j;
}
for(i=0;i<n;i++)
rank[i]=rank1[i];
}

}

void height(int n){
int i,j,k=0;
for(i=0;i<n;i++)
{
if(rank[i]==0)
h[rank[i]]=k=0;
else
{
if(k>0) k--;
j=sa[rank[i]-1];
for(;m[i+k]==m[j+k];k++);
h[rank[i]]=k;

}
}
}

int judge(int s,int t){

if(sa[s]<t&&sa[s-1]<t)
return(0);
if(sa[s]>t&&sa[s-1]>t)
return(0);
return(1);
}

int main(){
//ifstream cin("in.txt");
int i,j,k,t;

cin>>m;
//scanf("%s",m);
k=strlen(m);
t=k;
m[k]=2;
cin>>m+k+1;
//scanf("%s",m+k+1);

k=strlen(m);
m[k]=1;
k++;
creat(k);
height(k);
j=0;
for(i=1;i<k;i++)
if(j<h[i]&&judge(i,t))
j=h[i];
cout<<j<<endl;
return(0);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: