Pagini recente » Cod sursa (job #803966) | Cod sursa (job #2569493) | Cod sursa (job #2232313) | Cod sursa (job #301524) | Cod sursa (job #2385438)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[16385];
int a[15][16385];
struct pereche
{
char c;
int poz;
};
bool cmp(pereche a,pereche b)
{
return a.c<b.c;
}
pereche v[16385];
struct perint
{
int x,y,poz;
};
bool cmpi(perint a,perint b)
{
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
int detput(int x)
{
int nr=1;
while(nr<=x)
{
nr*=2;
}
nr/=2;
return nr;
}
int putd(int x)
{
int nr=0;
while(x)
{
nr++;
x/=2;
}
return nr;
}
perint vv[16385];
int main()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
int n,k,i,nr,j,nrp;
scanf("%d%d\n%s",&n,&k,s);
for(i=0;i<n;++i)
{
v[i].c=s[i];
v[i].poz=i;
}
sort(v,v+n,cmp);
nr=0;
for(i=0;i<n;++i)
{
if(i&&v[i].c!=v[i-1].c)
nr++;
a[0][v[i].poz]=nr;
}
for(i=2,nrp=1;i<=n;i*=2,++nrp)
{
for(j=0;j<n;++j)
{
vv[j].x=a[nrp-1][j];
if(j+i/2>=n)
vv[j].y=-1;
else
vv[j].y=a[nrp-1][j+(i/2)];
vv[j].poz=j;
}
sort(vv,vv+n,cmpi);
nr=0;
for(j=0;j<n;++j)
{
if(j&&(vv[j].x!=vv[j-1].x||vv[j].y!=vv[j-1].y))
nr++;
a[nrp][vv[j].poz]=nr;
}
}
for(i=0;i<nrp;++i)
{
sort(a[i],a[i]+n);
}
int maxim=0;
for(i=0;i<n-k;++i)
{
int st=i;
int dr=i+k-1;
int val=0;
for(j=nrp-1;j>=0;--j)
{
if(a[j][st]==a[j][dr])
{
val+=(1<<j);
st+=(1<<j);
dr+=(1<<j);
}
}
if(val>maxim)
maxim=val;
}
printf("%d\n",maxim);
return 0;
}