n||b<1||b>n)
return 0;
else if(a==b)
return n-a+1;
else{
a=rank[a];
b=rank[b];
if(a>b)
std::swap(a,b);
int p=lg[b-a];
++a;
return std::min(stmin[p][a],stmin[p][b-(1<=1;i--)
SA[cnt[x[i]]--]=i;
for(int k=1;kk)
y[++p]=SA[i]-k;
memset(cnt,0,sizeof(int)*(m+1));
for(int i=1;i<=n;i++)
++cnt[x[i]];
for(int i=1;i<=m;i++)
cnt[i]+=cnt[i-1];
for(int i=n;i>=1;i--)
SA[cnt[x[y[i]]]--]=y[i];
std::swap(x,y);
x[SA[1]]=1;
p=1;
for(int i=2;i<=n;i++)
x[SA[i]]=(y[SA[i]]==y[SA[i-1]]&&y[SA[i]+k]==y[SA[i-1]+k])?p:++p;
if(p>=n)
break;
m=p;
}
for(int i=1;i<=n;i++)
rank[SA[i]]=i;
int k=0;
for(int i=1;i<=n;i++){
if(rank[i]==1)
continue;
if(k)
--k;
int j=SA[rank[i]-1];
while(i+k<=n&&j+k<=n&&s[i+k]==s[j+k])
++k;
height[rank[i]]=k;
}
for(int i=1;(1<