Pagini recente » Cod sursa (job #2610526) | Cod sursa (job #155234) | Cod sursa (job #2416829) | Cod sursa (job #1944717) | Cod sursa (job #1583010)
#include <fstream>
#include <algorithm>
#define Ndim 16389
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
int suffx[15][Ndim],PozSuffx[Ndim],N,K,sol,pow;
char S[Ndim];
struct strct{int st,dr,poz;}L[Ndim];
inline bool cmp(const strct & a, const strct & b)
{
if(a.st == b.st)
return a.dr < b.dr;
return a.st < b.st;
}
void read()
{
fin>>N>>K>>S+1;
}
void suffix()
{
int i,k,cnt;
for(i=1;i<=N;i++)
suffx[0][i] = S[i]-'a';
for(pow = 1, cnt = 1; cnt >> 1 <= N; pow++ , cnt <<= 1 )
{
for(i=1;i<=N;i++)
{
L[i].st = suffx[pow-1][i];
L[i].dr = i + cnt <=N ? suffx[pow - 1][i + cnt] : -1;
L[i].poz = i;
}
sort(L+1,L+N+1,cmp);
for(i=1;i<=N;i++)
suffx[pow][L[i].poz] = i > 1 && L[i].st == L[i-1].st && L[i].dr == L[i-1].dr ? suffx[pow][L[i-1].poz] : i;
}
pow--;
}
int LCP(int x,int y)
{
int k,len = 0;
if(x == y)
return N-x;
for( k = pow; k>=0 && x <= N && y <= N; k--)
{
if(suffx[k][x] == suffx[k][y])
{
x += (1<<k);
y += (1<<k);
len += (1<<k);
}
}
return len;
}
void solve()
{
int i;
for(i=1;i<=N;i++)
PozSuffx[suffx[pow][i]] = i;
for(i=1;i<=N-K+1;i++)
{
sol = max(sol, LCP(PozSuffx[i],PozSuffx[i+K-1]));
}
}
void print()
{
fout<<sol;
}
int main()
{
read();
suffix();
solve();
print();
return 0;
}