Pagini recente » Cod sursa (job #2145967) | Cod sursa (job #2585319) | Monitorul de evaluare | Cod sursa (job #2909097) | Cod sursa (job #3258944)
#include <fstream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
const int nmax = 16384;
int n,k;
struct Sufel
{
int nr[2];
int p;
} l[nmax + 5];
int r[17][nmax + 5];
string s;
int bp;
void precompute()
{
for(int i = 1; i<=n; i++)
r[0][i] = s[i]-'a'+1;
for(int i=1; (1<<i)<=n; i++)
{
bp=i;
for(int j=1; j<=n; j++)
{
l[j].nr[0]=r[i-1][j];
l[j].nr[1]=-1;
if(j + (1<<(i-1)) <=n)
l[j].nr[1] = r[i-1][j+(1<<(i-1))];
l[j].p = j;
}
sort(l+1,l+n+1,[](const Sufel& a,const Sufel& b)
{
if(a.nr[0]==b.nr[0])
return a.nr[1]<b.nr[1];
return a.nr[0]<b.nr[0];
});
for(int j=1;j<=n;j++){
r[i][l[j].p] = j;
if(j>1 && l[j].nr[0] == l[j-1].nr[0] && l[j].nr[1]==l[j-1].nr[1])
r[i][l[j].p] = r[i][l[j-1].p];
}
}
/*
for(int i=0;(1<<i)<=n;i++)
{
for(int j=1;j<=n;j++)
{
fout<<r[i][j]<<' ';
}
fout<<'\n';
}*/
}
int lcp(int x,int y)
{
int sl = 0;
if(x==y)
return n-x+1;
for(int i = bp;i>=0 && x <=n && y <=n;i--)
{
if(r[i][x]==r[i][y])
x+=(1<<i),y+=(1<<i),sl+=(1<<i);
}
return sl;
}
int main()
{
fin>>n>>k;
fin>>s;
s='#' + s;
precompute();
int mx = 0;
for(int i=1;i+k-1<=n;i++)
{
int x = lcp(l[i].p,l[i+k-1].p);
mx=max(x,mx);
}
fout<<mx;
}