#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;
}