Pagini recente » Cod sursa (job #2592523) | Cod sursa (job #1871533) | Cod sursa (job #2718581) | Cod sursa (job #696562) | Cod sursa (job #1879556)
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct suffix
{
int poz,s1,s2;
bool operator <(const suffix &aux) const
{
if(s1==aux.s1) return s2<aux.s2;
else return s1<aux.s1;
}
bool operator ==(const suffix &aux) const
{
return (s1==aux.s1 && s2==aux.s2);
}
};
suffix v[17000];
int n,p[17][17000],logn;
char sir[17000];
int LCP(int a,int b)
{
int l=0;
for(int i=logn;i>=0;i--)
if(a+(1<<i)<=n+1 && b+(1<<i)<=n+1 && p[i][a]==p[i][b])
{
a+=1<<i;
b+=1<<i;
l+=1<<i;
}
return l;
}
int main()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
int k,sol=0;
scanf("%d%d\n",&n,&k);
gets(sir+1);
for(logn=1;(1<<logn)<=n;logn++)
for(int i=1;i<=n;i++)
{
v[i].poz=i;
p[0][i]=sir[i];
}
for(int bit=1;bit<=logn;bit++)
{
for(int i=1;i<=n;i++)
{
v[i].s1=p[bit-1][v[i].poz];
if(v[i].poz+(1<<(bit-1))<=n) v[i].s2=p[bit-1][v[i].poz+(1<<(bit-1))];
else v[i].s2=-1;
}
sort(v+1,v+n+1);
for(int i=2;i<=n;i++)
if(v[i]==v[i-1]) p[bit][v[i].poz]=p[bit][v[i-1].poz];
else p[bit][v[i].poz]=i;
}
for(int i=1;i<=n-k+1;i++) sol=max(sol,LCP(v[i].poz,v[i+k-1].poz));
printf("%d",sol);
return 0;
}