#include <iostream> using namespace std; #define maxn 1000001 #define cls(x) memset(x, 0, sizeof(x)) int wa[maxn],wb[maxn],wv[maxn],wss[maxn]; int cmp(int *r,int a,int b,int l) {return r[a]==r[b]&&r[a+l]==r[b+l];} void da(char *r,int *sa,int n,int m) { cls(wa); cls(wb); cls(wv); cls(wss); int i,j,p,*x=wa,*y=wb,*t; for(i=0;i<m;i++) wss[i]=0; for(i=0;i<n;i++) wss[x[i]=r[i]]++; for(i=1;i<m;i++) wss[i]+=wss[i-1]; for(i=n-1;i>=0;i--) sa[--wss[x[i]]]=i; for(j=1,p=1;p<n;j*=2,m=p) { for(p=0,i=n-j;i<n;i++) y[p++]=i; for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j; for(i=0;i<n;i++) wv[i]=x[y[i]]; for(i=0;i<m;i++) wss[i]=0; for(i=0;i<n;i++) wss[wv[i]]++; for(i=1;i<m;i++) wss[i]+=wss[i-1]; for(i=n-1;i>=0;i--) sa[--wss[wv[i]]]=y[i]; for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++) x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++; } return; } int rank[maxn],height[maxn]; void calheight(char *r,int *sa,int n) { cls(rank); cls(height); int i,j,k=0; for(i=1;i<n;i++) rank[sa[i]]=i; for(i=0;i<n;height[rank[i++]]=k) for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++); return; } char ca[maxn * 2]; int sa[maxn]; int main() { while (cin >> ca) { int len = strlen(ca); int lenstr1 = len; ca[len] = '#'; cin >> (ca + len + 1); len = strlen(ca); da(ca, sa, len, 300); calheight(ca,sa,len); int max = 0; //cout << ca << endl; for (int i = 1; i < len; ++i) { if (height[i] > max) { if ((sa[i] > lenstr1 && sa[i - 1] < lenstr1) || (sa[i - 1] > lenstr1 && sa[i] < lenstr1)) { max = height[i]; } } } //for (int i = 0; i < len; ++i) //cout << (ca + i) << endl; cout << max << endl; cls(ca); } return 0; }