#include <cstdio>
#include <cstring>
const int maxn = 600000;
char ch[maxn];
struct node {node *ch[28], *f; int l;} a[maxn], *head, *last;
int n, i, top = -1, ans = 0, mid;
int max(int a1, int a2) {return a1 >= a2 ? a1 : a2;}
void add(int x)
{
node *p = &a[++top], *bj = last;
p->l = last->l + 1; last = p;
for (; bj && !bj->ch[x]; bj = bj->f)
bj->ch[x] = p;
if (!bj) p->f = head;
else if (bj->l + 1 == bj->ch[x]->l) p->f = bj->ch[x];
else
{
node *r = &a[++top], *q = bj->ch[x];
*r = *q, r->l = bj->l + 1, p->f = q->f = r;
for (; bj && bj->ch[x] == q; bj = bj->f) bj->ch[x] = r;
}
}
int main()
{
freopen("lcs.in", "r", stdin);
freopen("lcs.out", "w", stdout);
scanf("%s\n", ch);
n = strlen(ch);
last = head = &a[++top];
for (i = 0; i < n; ++i)
add(ch[i] - 'a' + 1);
scanf("%s\n", ch);
n = strlen(ch);
for (i = 0, last = head; i < n; ++i, ans = max(ans, mid))
{
if (last->ch[ch[i] = ch[i] - 'a' + 1]) ++mid, last = last->ch[ch[i]]; else
{
for (; last && !last->ch[ch[i]]; last = last->f);
if (!last) last = head, mid = 0;
else mid = last->l + 1, last = last->ch[ch[i]];
}
}
printf("%d\n", ans);
return 0;
}
#include <cstring>
const int maxn = 600000;
char ch[maxn];
struct node {node *ch[28], *f; int l;} a[maxn], *head, *last;
int n, i, top = -1, ans = 0, mid;
int max(int a1, int a2) {return a1 >= a2 ? a1 : a2;}
void add(int x)
{
node *p = &a[++top], *bj = last;
p->l = last->l + 1; last = p;
for (; bj && !bj->ch[x]; bj = bj->f)
bj->ch[x] = p;
if (!bj) p->f = head;
else if (bj->l + 1 == bj->ch[x]->l) p->f = bj->ch[x];
else
{
node *r = &a[++top], *q = bj->ch[x];
*r = *q, r->l = bj->l + 1, p->f = q->f = r;
for (; bj && bj->ch[x] == q; bj = bj->f) bj->ch[x] = r;
}
}
int main()
{
freopen("lcs.in", "r", stdin);
freopen("lcs.out", "w", stdout);
scanf("%s\n", ch);
n = strlen(ch);
last = head = &a[++top];
for (i = 0; i < n; ++i)
add(ch[i] - 'a' + 1);
scanf("%s\n", ch);
n = strlen(ch);
for (i = 0, last = head; i < n; ++i, ans = max(ans, mid))
{
if (last->ch[ch[i] = ch[i] - 'a' + 1]) ++mid, last = last->ch[ch[i]]; else
{
for (; last && !last->ch[ch[i]]; last = last->f);
if (!last) last = head, mid = 0;
else mid = last->l + 1, last = last->ch[ch[i]];
}
}
printf("%d\n", ans);
return 0;
}