Pagini recente » Cod sursa (job #427731) | Cod sursa (job #2275254) | Cod sursa (job #1708760) | Cod sursa (job #879757) | Cod sursa (job #1106372)
#include<stdio.h>
#include<algorithm>
#define maxn 17000
#define maxlg 16
using namespace std;
struct srt{int x,y,ind;} ord[maxn];
int n,K,sol,step;
char a[maxn];
int p[maxlg][maxn],pos[maxn];
void read()
{
scanf("%d%d\n",&n,&K);
scanf("%s",a+1);
}
bool cmp(const srt &a,const srt &b){
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
void suffix()
{
int nr;
for(int i=1;i<=n;i++) p[0][i]=a[i]-'a';
for(step=1,nr=1;nr<n;step++,nr<<=1)
{
for(int i=1;i<=n;i++)
{
ord[i].x=p[step-1][i]; ord[i].y=-1;
if(i+nr<=n) ord[i].y=p[step-1][i+nr];
ord[i].ind=i;
}
sort(ord+1,ord+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(i>1 && ord[i].x==ord[i-1].x && ord[i].y==ord[i-1].y)
p[step][ord[i].ind]=p[step][ord[i-1].ind];
else p[step][ord[i].ind]=i;
}
}
for(int i=1;i<=n;i++) pos[p[step-1][i]]=i;
}
int lcp(int x,int y)
{
int r=0;
if(x==y) return n-x+1;
for(int i=step-1;i>=0 && x<=n && y<=n;i--)
if(p[i][x]==p[i][y])
r+=(1<<i),x+=(1<<i),y+=(1<<i);
return r;
}
void solve()
{
for(int i=1;i+K-1<=n;i++) sol=max(sol,lcp(pos[i],pos[i+K-1]));
}
int main()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
read();
suffix();
solve();
printf("%d",sol);
fclose(stdin);
fclose(stdout);
return 0;
}