Pagini recente » Cod sursa (job #1980431) | Cod sursa (job #826003) | Cod sursa (job #1613346) | Cod sursa (job #2345575) | Cod sursa (job #2385394)
#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,st,dr,med,nrp,ok;
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;
}
}
st=1;
dr=n;
int sol=1;
for(i=0;i<nrp;++i)
{
sort(a[i],a[i]+n);
}
while(st<=dr)
{
med=(st+dr)/2;
ok=0;
for(j=0;j<n-med;++j)
{
int val=med,lp=j;
while(val)
{
int vald=detput(val);
int pd=putd(vald);
if(a[pd][lp]==a[pd][lp+med-1])
{
val-=vald;
lp+=vald;
}
else
break;
}
if(!val)
{
ok=1;
break;
}
}
if(ok)
{
sol=med;
st=med+1;
}
else
dr=med-1;
}
printf("%d\n",sol);
return 0;
}