const int N = 1e6 + 10;
typedef long long ll;
char s1[N],s2[N];
int nex[N],extend[N];
void get_next(char s[])
{
int len = strlen(s);
nex[0] = len;
int mx = 0,id;
for(int i = 1;i < len;i++)
{
if(i < mx) nex[i] = min(mx-i,nex[i-id]);
else nex[i] = 0;
while(s[i+nex[i]] == s[nex[i]]) nex[i]++;
if(mx < i + nex[i])
{
id = i;
mx = i + nex[i];
}
}
}
void get_exted()
{
int len = strlen(s1);
int mx = 0,id;
for(int i = 0;i < len;i++)
{
if(i < mx) extend[i] = min(mx-i,nex[i-id]);
else extend[i] = 0;
while(s1[i+extend[i]] == s2[extend[i]] && s2[extend[i]] != '\0') extend[i]++;
if(mx < extend[i]+i)
{
id = i;
mx = extend[i] + i;
}
}
}