//Try using Rabin Karp
/*
this code uses rabin karp +binary seach +hashing
*/
#include <iostream>
#include <vector>
#include <string.h>
#include <sstream>
typedef long long int lli;
#define sz(a) lli((a).size())
#define pb push_back
#define all(c) (c).begin(),(c).end()
#define tr(c,i) for(typeof((c).begin() i = (c).begin(); i != (c).end(); i++)
#define present(c,x) ((c).find(x) != (c).end())
#define cpresent(c,x) (find(all(c),x) != (c).end())
#include <stdio.h>
#include <set>
#include <algorithm>
#include <numeric>
#include <stack>
#include <list>
#include <queue>
#define MOD 1000000007
#define MAX 250005
#include <map>
using namespace std;
typedef vector<lli> vi;
typedef vector<vi> vvi;
typedef pair<lli,lli> ii;
lli q=10000019;
vector<lli> hasharr(q,-1);
bool LCS(char *ans,char *inp1,char *inp2,lli n)
{
lli d=27;//ASCII Value in total
std::fill(hasharr.begin(), hasharr.end(), -1);
lli M=n;
lli N=strlen(inp1);
lli n2=strlen(inp2);
lli p=0;
lli t=0;
lli h=1;
for(lli i=0;i<M-1;i++)
h=(h%q*d%q)%q;
for(lli i=0;i<M;i++)
{ p=(d*p%q+inp2[i]%q)%q;
t=(d*t%q+inp1[i]%q)%q;
}
hasharr[t]=0;
for(lli i=0;i<=N-M;i++)
{
if(i<N-M)
{ t=((d*(t%q-(inp1[i]*h)%q ))%q+inp1[i+M]%q)%q;
if(t<0)
t+=q;
hasharr[t]=i+1;
}//cout<<"T hash is "<<t<<endl;
//m1[t]=i+1;
}
lli flag=0;
lli ansind;
for(lli i=0;i<=n2-M;i++)
{//cout<<"p hash is "<<p<<endl;
if(hasharr[p]!=-1)
{
ansind=hasharr[p];
flag=1;
break;
}
if(i<n2-M)
{ p=((d*(p%q-(inp2[i]*h)%q ))%q+inp2[i+M]%q)%q;
if(p<0)
p=p+q;
// cout<<"\n\n"<<inp1[i]<<" "<<inp1[i+M]<<endl;
}
if(hasharr[p]!=-1)
{ ansind=hasharr[p];
flag=1;
break;
}
//m1[t]=i+1;
}
for(lli i=ansind;i<ansind+M and flag==1;i++)
{
ans[i-ansind]=inp1[i];
}
if(flag==1)
{//cout<<endl<<"returning true for M is "<<M<<endl;
return true;
}
return false;
}
lli calculate(char *ans,char *inp1,char *inp2)
{ lli lo=1;
lli hi=strlen(inp2);
lli middle;
lli flag=0;
while(lo<=hi)
{
if(lo==hi)
{LCS(ans,inp1,inp2,lo);break;}
middle=(lo+hi+1)/2;
//cout<<"middle is "<<middle<<endl;
if(LCS(ans,inp1,inp2,middle)==true)
{ //cout<<"true at "<<middle<<endl;
lo=middle;
}
else
{//cout<<"not valid"<<endl;
hi=middle-1;
}
}
//cout<< "ans in calfunc "<<ans<<endl;
if(LCS(ans,inp1,inp2,lo))
{
return lo;
}
else
return -1;
}
int main()
{ char *inp1=new char[250005];
char *inp2=new char[250005];
cin>>inp1>>inp2;
char *ans=new char[250005];
lli n=calculate(ans,inp1,inp2);
if(n!=-1)
{// cout<<"ans\n";
cout<<ans<<endl;
cout<<n<<endl;
}
else
cout<<0<<endl;
return 0;
}
Ly9UcnkgdXNpbmcgUmFiaW4gS2FycAovKgp0aGlzIGNvZGUgdXNlcyByYWJpbiBrYXJwICtiaW5hcnkgc2VhY2ggK2hhc2hpbmcKCgoKCgoKKi8KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzc3RyZWFtPgp0eXBlZGVmICBsb25nIGxvbmcgaW50IGxsaTsKI2RlZmluZSBzeihhKSBsbGkoKGEpLnNpemUoKSkKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBhbGwoYykgKGMpLmJlZ2luKCksKGMpLmVuZCgpCiNkZWZpbmUgdHIoYyxpKSBmb3IodHlwZW9mKChjKS5iZWdpbigpIGkgPSAoYykuYmVnaW4oKTsgaSAhPSAoYykuZW5kKCk7IGkrKykKI2RlZmluZSBwcmVzZW50KGMseCkgKChjKS5maW5kKHgpICE9IChjKS5lbmQoKSkKI2RlZmluZSBjcHJlc2VudChjLHgpIChmaW5kKGFsbChjKSx4KSAhPSAoYykuZW5kKCkpCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8bnVtZXJpYz4KI2luY2x1ZGUgPHN0YWNrPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPHF1ZXVlPgojZGVmaW5lIE1PRCAxMDAwMDAwMDA3CiNkZWZpbmUgTUFYIDI1MDAwNQojaW5jbHVkZSA8bWFwPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp0eXBlZGVmIHZlY3RvcjxsbGk+IHZpOwp0eXBlZGVmIHZlY3Rvcjx2aT4gdnZpOwp0eXBlZGVmIHBhaXI8bGxpLGxsaT4gaWk7CmxsaSBxPTEwMDAwMDE5Owp2ZWN0b3I8bGxpPiBoYXNoYXJyKHEsLTEpOwpib29sIExDUyhjaGFyICphbnMsY2hhciAqaW5wMSxjaGFyICppbnAyLGxsaSBuKQp7CglsbGkgZD0yNzsvL0FTQ0lJIFZhbHVlIGluIHRvdGFsCiAKCXN0ZDo6ZmlsbChoYXNoYXJyLmJlZ2luKCksIGhhc2hhcnIuZW5kKCksIC0xKTsKCWxsaSBNPW47CiAgCWxsaSBOPXN0cmxlbihpbnAxKTsKICAJbGxpIG4yPXN0cmxlbihpbnAyKTsKICAJbGxpIHA9MDsKICAJbGxpIHQ9MDsKICAJbGxpIGg9MTsKICAJZm9yKGxsaSBpPTA7aTxNLTE7aSsrKQogICAJCWg9KGglcSpkJXEpJXE7CiAgIAlmb3IobGxpIGk9MDtpPE07aSsrKQogICAJeyAJcD0oZCpwJXEraW5wMltpXSVxKSVxOwogICAgIAl0PShkKnQlcStpbnAxW2ldJXEpJXE7CiAgIAl9CgloYXNoYXJyW3RdPTA7CiAgIGZvcihsbGkgaT0wO2k8PU4tTTtpKyspCiAgIHsKIAogICAgICAgaWYoaTxOLU0pCiAgICAgICB7IHQ9KChkKih0JXEtKGlucDFbaV0qaCklcSApKSVxK2lucDFbaStNXSVxKSVxOwogCiAgICAgICAgIGlmKHQ8MCkKICAgICAgICAgCXQrPXE7CiAgICAgICAgaGFzaGFyclt0XT1pKzE7CiAKIAogICAgICAgfS8vY291dDw8IlQgaGFzaCBpcyAiPDx0PDxlbmRsOwogICAgICAgLy9tMVt0XT1pKzE7CiAgIH0gCiAgIGxsaSBmbGFnPTA7CiAgIGxsaSBhbnNpbmQ7CiAgIGZvcihsbGkgaT0wO2k8PW4yLU07aSsrKQogICB7Ly9jb3V0PDwicCBoYXNoIGlzICI8PHA8PGVuZGw7CgkgaWYoaGFzaGFycltwXSE9LTEpCiAgICAJICAgIHsKICAgIAkgICAgIGFuc2luZD1oYXNoYXJyW3BdOwogICAgICAgIAkgZmxhZz0xOwogICAgCQkgYnJlYWs7CiAKIAogICAgICAgICAgICB9CiAKICAgICAgIGlmKGk8bjItTSkKICAgICAgICAgICAgeyBwPSgoZCoocCVxLShpbnAyW2ldKmgpJXEgKSklcStpbnAyW2krTV0lcSklcTsKIAogICAgICAgICAgICAgIGlmKHA8MCkKICAgICAgICAgICAgICAgcD1wK3E7CiAgICAgICAvLyBjb3V0PDwiXG5cbiI8PGlucDFbaV08PCIgIjw8aW5wMVtpK01dPDxlbmRsOwogICAgICAgICAgICB9CiAgICAgICBpZihoYXNoYXJyW3BdIT0tMSkKICAgICAgICB7CWFuc2luZD1oYXNoYXJyW3BdOwogICAgICAgIAlmbGFnPTE7CiAgICAgICAgCWJyZWFrOwogCiAKICAgICAgICB9CiAKICAgICAgIC8vbTFbdF09aSsxOwogICB9CiAgIGZvcihsbGkgaT1hbnNpbmQ7aTxhbnNpbmQrTSBhbmQgZmxhZz09MTtpKyspCiAgIHsKICAgCWFuc1tpLWFuc2luZF09aW5wMVtpXTsKIAogICB9CiAgIGlmKGZsYWc9PTEpCiAgICB7Ly9jb3V0PDxlbmRsPDwicmV0dXJuaW5nIHRydWUgZm9yIE0gaXMgIjw8TTw8ZW5kbDsKCXJldHVybiB0cnVlOwogICAgfQpyZXR1cm4gZmFsc2U7Cn0KbGxpIGNhbGN1bGF0ZShjaGFyICphbnMsY2hhciAqaW5wMSxjaGFyICppbnAyKQp7IGxsaSBsbz0xOwogIGxsaSBoaT1zdHJsZW4oaW5wMik7CiAgbGxpICBtaWRkbGU7CiAgbGxpIGZsYWc9MDsKICB3aGlsZShsbzw9aGkpCiAgeyAKIAlpZihsbz09aGkpCiAJe0xDUyhhbnMsaW5wMSxpbnAyLGxvKTticmVhazt9CiAgCW1pZGRsZT0obG8raGkrMSkvMjsKICAgIC8vY291dDw8Im1pZGRsZSBpcyAiPDxtaWRkbGU8PGVuZGw7CiAgICBpZihMQ1MoYW5zLGlucDEsaW5wMixtaWRkbGUpPT10cnVlKQogICAgeyAvL2NvdXQ8PCJ0cnVlIGF0ICI8PG1pZGRsZTw8ZW5kbDsKICAgIAlsbz1taWRkbGU7IAogICAgfQogICAgZWxzZQogICB7Ly9jb3V0PDwibm90IHZhbGlkIjw8ZW5kbDsKICAgIAloaT1taWRkbGUtMTsKICAgfQogCiAgfQogIC8vY291dDw8ICJhbnMgaW4gY2FsZnVuYyAiPDxhbnM8PGVuZGw7CiBpZihMQ1MoYW5zLGlucDEsaW5wMixsbykpCiAgewogICAgcmV0dXJuICBsbzsKICB9CiAgZWxzZQogICAgcmV0dXJuIC0xOwogCiAKfQppbnQgbWFpbigpCnsgY2hhciAqaW5wMT1uZXcgY2hhclsyNTAwMDVdOwogIGNoYXIgKmlucDI9bmV3IGNoYXJbMjUwMDA1XTsKICBjaW4+PmlucDE+PmlucDI7CiAgY2hhciAqYW5zPW5ldyBjaGFyWzI1MDAwNV07CiAgbGxpIG49Y2FsY3VsYXRlKGFucyxpbnAxLGlucDIpOwogIGlmKG4hPS0xKQogIHsvLyBjb3V0PDwiYW5zXG4iOwogIGNvdXQ8PGFuczw8ZW5kbDsKICAgIGNvdXQ8PG48PGVuZGw7CiAKIAogIH0KICBlbHNlCiAgY291dDw8MDw8ZW5kbDsKIHJldHVybiAwOwp9