Pagini recente » Cod sursa (job #2290320) | Cod sursa (job #377320) | Cod sursa (job #1099805) | Cod sursa (job #1841187) | Cod sursa (job #1638461)
#include <fstream>
#include <algorithm>
#define nMax 16400
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
int n, k, P[20][nMax], stp, cnt, Max, Proc[nMax];
char S[nMax];
struct sufixe
{
int nr[2], p;
}L[nMax];
int cmp(const sufixe& a, const sufixe& 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>>S+1;
}
void sufix_array()
{
for(int i=1;i<=n;i++)
P[0][i]=S[i]-'a';
for(stp=1, cnt=1;cnt >> 1<=n;cnt <<= 1, stp++)
{
for(int 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(int i=1;i<=n;i++)
P[stp][L[i].p]= i>0 && 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 y-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()
{
sufix_array();
for(int i=1;i<=n;i++)
Proc[P[stp][i]]=i;
for(int i=1;i<=n-k+1;i++)
Max=max(Max, LCP(Proc[i], Proc[i+k-1]));
}
void write()
{
fout<<Max;
}
int main()
{
read();
solve();
write();
return 0;
}