标签:
Time Limit: 4000MS | Memory Limit: 131072K | |
Total Submissions: 25018 | Accepted: 10237 | |
Case Time Limit: 1000MS |
Description
Input
Output
Sample Input
yeshowmuchiloveyoumydearmotherreallyicannotbelieveit
yeaphowmuchiloveyoumydearmother
Sample Output
27
Source
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #include<queue> 7 #include<vector> 8 using namespace std; 9 const int maxn=200000; 10 int r[maxn],sa[maxn],wa[maxn],wb[maxn],wv[maxn],Ws[maxn]; 11 int cmp(int *r,int a,int b,int l){ 12 return r[a]==r[b]&&r[a+l]==r[b+l]; 13 } 14 void da(int *r,int *sa,int n,int m){ 15 int i,j,p,*x=wa,*y=wb,*t; 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 21 for(j=1,p=1;p<n;j*=2,m=p){ 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 25 for(i=0;i<n;i++) wv[i]=x[y[i]]; 26 for(i=0;i<m;i++) Ws[i]=0; 27 for(i=0;i<n;i++) Ws[wv[i]]++; 28 for(i=1;i<m;i++) Ws[i]+=Ws[i-1]; 29 for(i=n-1;i>=0;i--) sa[--Ws[wv[i]]]=y[i]; 30 31 for(t=x,x=y,y=t,p=1,i=1,x[sa[0]]=0;i<n;i++) 32 x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++; 33 } 34 } 35 int rank[maxn],height[maxn]; 36 void calheight(int *r,int *sa,int n){ 37 int i,j,k=0; 38 for(i=0;i<n;i++) rank[sa[i]]=i; 39 for(i=0;i<n;height[rank[i++]]=k) 40 for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++); 41 return ; 42 } 43 char s1[maxn],s2[maxn]; 44 int len1,len2,now,num[maxn],ans; 45 int main(){ 46 scanf("%s%s",s1,s2); len1=strlen(s1); len2=strlen(s2); 47 for(int i=0;i<len1;i++) num[now++]=s1[i]-‘a‘+2; 48 num[now++]=1; 49 for(int i=0;i<len2;i++) num[now++]=s2[i]-‘a‘+2; 50 da(num,sa,now,30); 51 calheight(num,sa,now); 52 for(int i=1;i<now;i++) 53 if((sa[i]<len1&&sa[i-1]>len1)||(sa[i-1]<len1&&sa[i]>len1)) 54 ans=max(ans,height[i]); 55 printf("%d",ans); 56 return 0; 57 }
标签:
原文地址:http://www.cnblogs.com/CXCXCXC/p/5176764.html