Pagini recente » Cod sursa (job #1037710) | Cod sursa (job #474620) | Cod sursa (job #1463542) | Cod sursa (job #800925) | Cod sursa (job #1764965)
#include <cstdio>
#include <algorithm>
#include<string.h>
#define MAXN 32762
#define LG 14
struct aa{
int v1,v2,pos;
}v[MAXN+1];
int n, p[LG+1][MAXN+1], l;
char s[MAXN+2];
bool cmp(const aa &a, const aa &b)
{
if(a.v1==b.v1)
{
if(a.v2==b.v2)
return (a.pos < b.pos);
return (a.v2<b.v2);
}
return (a.v1<b.v1);
}
inline int lcp(int x, int y)
{
int k, ans=0;
if(x==y) return n-x+1;
for(k=LG; k>=0; --k)
if((1<<k)<=n)
if(p[k][x] == p[k][y])
x+=(1<<k), y+=(1<<k), ans+=(1<<k);
return ans;
}
inline int maxim(int a, int b)
{
if(a>b)
return a;
return b;
}
int main()
{
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
int k, ans=0;
scanf("%d%d\n", &n, &k);
gets(s+1);
for(int i=1;i<=n;++i)
p[0][i]=s[i];
for(int log=1;(1<<log)<=n;++log)
{
for(int i=1;i<=n;++i)
{
v[i].v1=p[log-1][i];
v[i].v2=p[log-1][i+(1<<(log-1))];
v[i].pos=i;
}
std::sort(v+1, v+n+1, cmp);
for(int i=1;i<=n;++i)
if(v[i].v1 == v[i-1].v1 && v[i].v2 == v[i-1].v2)
p[log][v[i].pos]=p[log][v[i-1].pos];
else p[log][v[i].pos]=i;
l=log;
}
for(int i=1;i<=n-k+1;++i)
ans=maxim(ans, lcp(v[i].pos, v[i+k-1].pos));
printf("%d", ans);
return 0;
}