#include <cstdio>
#include <iostream>
#include <cstring>
#include <string.h>

using namespace std;

const int NMAX=100000;

int *z;

void makeZ(char *s)
{
  int n = strlen(s);
  z = new int [n];
  int l=0, r=0;
  z[0]=0;
  for(int k=1;k<n;k++)
  {

    if (k>r)
    {
      l=r=k;
      while ( (r<n) && (s[r]==s[r-k]) ) r++;
      r--;
      z[k] = r-k+1;
    }

    else

    {
      z[k] = z[k-l];
      //если k длины z[k] заканчивается ещё до r, то дальше
      //искать бесперспективно - ведь дальше подстроки одинаковые,
      //и если первая не совпала с суффиксом, так и вторая уж
      //точно не совпадёт
      int r1 = k+z[k];
      if (r1<r) continue;
      //Заметим, что мы сразу пропустили заведомо совпадающие символы
      r1 = r+1; //поскольку мы не знаем, что там справа стоит
      while ((r1<n) && (s[r1]==s[r1-k]) ) r1++;
      r1--;
      z[k] = r1-k+1;
      if (r1>r)
      {
        r = r1; l=k;
      }
    }

  }
}

char s[NMAX*2+1];
char *s1, *s2;
int n1, n2;

void strrev(char *s)
{
	int len = strlen(s);
	for (int i = 0; i < len / 2; i++)
	{
		char t = s[i];
		s[i] = s[len-i-1];
		s[len-i-1] = t;
	}
	
}

int main (){
//  freopen("sat.in","r",stdin);
//  freopen("sat.out","w",stdout);

  cin >> s; 
  s1 = s;
  n1 = strlen(s1);
  strrev(s1);

  s2 = s1+n1;
  cin>>s2;
  n2=strlen(s2);
  strrev(s2);

  strrev(s);
  makeZ(s);

  int zmax=0;
  for (int i=0; i<n1; i++)
    if (z[n2+i]>zmax && z[n2+i]==n1-i) zmax=z[n2+i];

  cout << zmax << endl;

  return 0;
}
