Pagini recente » Cod sursa (job #944079) | Monitorul de evaluare | Rating Plesa Miriam (PlesaMiriam) | Cod sursa (job #974043) | Cod sursa (job #1581290)
#include <fstream>
#include <algorithm>
#define nMax 16389
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
int P[23][nMax], n, k, stp, cnt, i, Max, Proc[nMax];
char text[nMax];
struct strct
{
int nr[2], p;
}L[nMax];
int cmp(const strct &a, const strct &b)
{
return a.nr[0]==b.nr[0] ? (a.nr[1]<b.nr[1]) : (a.nr[0]<b.nr[0]);
}
void read()
{
fin>>n>>k;
fin>>text+1;
}
void sufix_array()
{
for(i=1;i<=n;i++)
P[0][i]=text[i]-'a';
for(stp=1, cnt=1; cnt >> 1 <=n; stp++, cnt <<= 1)
{
for(i=1;i<=n;i++)
{
L[i].nr[0]=P[stp-1][i];
L[i].nr[1]=i+cnt<=n ? P[stp-1][i+cnt] : -1;
L[i].p=i;
}
sort(L+1, L+n+1, cmp);
for(i=1;i<=n;i++)
P[stp][L[i].p]=i>1 && L[i].nr[0]==L[i-1].nr[0] && L[i].nr[1] == L[i-1].nr[1] ? P[stp][L[i-1].p] : i;
}
stp--;
}
int LCP(int x, int y)
{
int k, ret=0;
if(x==y)
return n-x+1;
for(k=stp;k>=0 && x<=n && y<=n;k--)
if(P[k][x]==P[k][y])
{
ret+= 1 << k;
x+= 1 << k;
y+= 1 << k;
}
return ret;
}
void solve()
{
for(i=1;i<=n;i++)
Proc[P[stp][i]]=i;
for(i=1;i<=n-k+1;i++)
Max=max(LCP(Proc[i], Proc[i+k-1]), Max);
}
int main()
{
read();
sufix_array();
solve();
fout<<Max;
return 0;
}