POJ2774 (后缀数组)

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 char a[250000],b[110000];
 5 int sa[250000],x[250000],wv[250000],ws[250000],h[250000],rank[250000],wa[250000],wb[250000];
 6 int cmp(int *r,int a,int b,int l){return (r[a]==r[b])&&(r[a+l]==r[b+l]);}
 7 void calheight(int n,int *rank)
 8 {
 9   int i,j,k=0;
10   for(i=0;i<n;h[rank[i++]]=k)
11   for(k?k--:0,j=sa[rank[i]-1];a[i+k]==a[j+k];k++);
12 }
13 void DA(char *r,int *sa,int n,int m)
14 {
15   int i,j,k,*x=wa,*y=wb,*t,p;
16   for(i=0;i<m;i++)ws[i]=0;
17   for(i=0;i<n;i++)ws[x[i]=r[i]]++;
18   for(i=1;i<m;i++)ws[i]+=ws[i-1];
19   for(i=n-1;i>=0;i--)sa[--ws[x[i]]]=i;
20   for(j=1,p=1;p<n;j*=2,m=p)
21   {
22     for(p=0,i=n-j;i<n;i++)y[p++]=i;
23     for(i=0;i<n;i++)if(sa[i]>=j)y[p++]=sa[i]-j;
24     for(i=0;i<n;i++)wv[i]=x[y[i]];
25     for(i=0;i<m;i++)ws[i]=0;
26     for(i=0;i<n;i++)ws[wv[i]]++;
27     for(i=1;i<m;i++)ws[i]+=ws[i-1];
28     for(i=n-1;i>=0;i--)sa[--ws[wv[i]]]=y[i];
29     for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++)
30     x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
31   }
32   calheight(n,x);
33 }
34 int main()
35 {
36   int la,lb,f_b,f_e,s_b,s_e,max,i,n;
37   scanf("%s",a);
38   la=strlen(a);
39   scanf("
");
40   scanf("%s",b);
41   lb=strlen(b);
42   f_b=0;
43   f_e=la-1;
44   a[la]='#';
45   s_b=la;
46   for(i=0;i<lb;i++)a[++la]=b[i];
47   s_e=la;
48   a[la+1]=0;
49   DA(a,sa,la+1,256);
50   //calheight(la+1); 
51   max=-0x7fffffff;
52   for(i=2;i<=la;i++)
53   {
54     if(h[i]>max&&((sa[i]>=f_b&&sa[i]<=f_e&&sa[i-1]>=s_b&&sa[i-1]<=s_e)||(sa[i]>=s_b&&sa[i]<=s_e&&sa[i-1]>=f_b&&sa[i-1]<=f_e)))max=h[i];
55   }
56   printf("%d",max);
57   return 0;
58 }
原文地址:https://www.cnblogs.com/wjcwjc/p/4978252.html