Pagini recente » Cod sursa (job #1360698) | Cod sursa (job #1325102) | Cod sursa (job #104711) | Cod sursa (job #534870) | Cod sursa (job #512817)
Cod sursa(job #512817)
#include<stdio.h>
#include<algorithm>
using namespace std;
#define maxim(a,b) (a>b ? a : b)
#define pii pair< pair<int,int>, int>
#define x first.first
#define y first.second
#define z second
int sol,suff[17005];
int A[17][17005],n,k,h;
char fol[305],s[17005];
pii v[17005];
int prefix(int px,int py)
{
int k,p=0;
for(k=h; k>=0; k--)
if (px+(1<<k)-1<=n && py+(1<<k)-1<=n &&
A[k][px]==A[k][py])
px+=(1<<k), py+=(1<<k), p+=(1<<k);
return p;
}
int main ()
{
int i,l,g,p;
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d%d\n",&n,&k);
s[0]=' ';
fgets(s+1,sizeof(s),stdin);
for(i=1;i<=n;i++)
fol[(int)s[i]]=1;
for(i=1;i<256;i++)
fol[i]+=fol[i-1];
for(i=1;i<=n;i++)
A[0][i]=fol[(int)s[i]-1]+1;
for(l=2,h=1;l/2<=n;l*=2,h++)
{
for(i=1;i<=n;i++)
{
v[i].x=A[h-1][i];
if (i+l/2 <= n)
v[i].y=A[h-1][i+l/2];
else
v[i].y=0;
v[i].z=i;
}
sort(v+1,v+n+1);
g=1;
for(i=1;i<=n;i++)
{
if(i>1 && (v[i].x!=v[i-1].x || v[i].y!=v[i-1].y))
g++;
A[h][v[i].z]=g;
}
}
h--;
for(i=1;i<=n;i++)
suff[A[h][i]]=i;
for(i=1;i<=n-k+1;i++)
{
p=prefix(suff[i],suff[i+k-1]);
sol=maxim(sol,p);
}
printf("%d\n",sol);
return 0;
}