Time Limit: 4000MS | Memory Limit: 131072K | |
Total Submissions: 19206 | Accepted: 7934 | |
Case Time Limit: 1000MS |
Description
Input
Output
Sample Input
yeshowmuchiloveyoumydearmotherreallyicannotbelieveit yeaphowmuchiloveyoumydearmother
Sample Output
27
1 #include <iostream> 2 #include <stdio.h> 3 #include <math.h> 4 #include <vector> 5 #include <string.h> 6 using namespace std; 7 #define N 2100000 8 char a[N]; 9 int c[N],d[N],e[N],sa[N],height[N],n,b[N],m,t; 10 int cmp(int *r,int a,int b,int l) 11 { 12 return r[a]==r[b]&&r[a+l]==r[b+l]; 13 } 14 void da() 15 { 16 int i,j,p,*x=c,*y=d,*t; 17 memset(b,0,sizeof(b)); 18 for(i=0; i<n; i++)b[x[i]=a[i]]++; 19 for(i=1; i<m; i++)b[i]+=b[i-1]; 20 for(i=n-1; i>=0; i--)sa[--b[x[i]]]=i; 21 for(j=1,p=1; p<n; j*=2,m=p) 22 { 23 for(p=0,i=n-j; i<n; i++)y[p++]=i; 24 for(i=0; i<n; i++)if(sa[i]>=j)y[p++]=sa[i]-j; 25 for(i=0; i<n; i++)e[i]=x[y[i]]; 26 for(i=0; i<m; i++)b[i]=0; 27 for(i=0; i<n; i++)b[e[i]]++; 28 for(i=1; i<m; i++)b[i]+=b[i-1]; 29 for(i=n-1; i>=0; i--)sa[--b[e[i]]]=y[i]; 30 for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1; i<n; i++) 31 x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++; 32 } 33 } 34 void callheight() 35 { 36 int i,j,k=0; 37 b[0]=0; 38 for(i=1; i<n; i++)b[sa[i]]=i; 39 for(i=0; i<n-1; height[b[i++]]=k) 40 for(k?k--:0,j=sa[b[i]-1]; a[i+k]==a[j+k]; k++); 41 } 42 bool check(int x,int y) 43 { 44 if(x>y)swap(x,y); 45 if(x<t&&y>t)return 1; 46 else return 0; 47 } 48 int main() 49 { 50 51 scanf("%s",a); 52 t=n=strlen(a); 53 a[n]=‘#‘; 54 scanf("%s",a+n+1); 55 n=1+strlen(a); 56 m=150; 57 da(); 58 callheight(); 59 int max=0; 60 for(int i=1;i<n;i++) 61 { 62 if(height[i]>max&&check(sa[i],sa[i-1])) 63 max=height[i]; 64 } 65 printf("%d\n",max); 66 }
Long Long Message (poj2774 后缀数组求最长公共子串),布布扣,bubuko.com
Long Long Message (poj2774 后缀数组求最长公共子串)
原文:http://www.cnblogs.com/ERKE/p/3598503.html