Pagini recente » Cod sursa (job #2301061) | Cod sursa (job #673281) | Cod sursa (job #2409559) | Cod sursa (job #2729463) | Cod sursa (job #345665)
Cod sursa(job #345665)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define file_in "substr.in"
#define file_out "substr.out"
#define Nmax 17000
#define Lg 17
char A[Nmax];
struct entry
{
int nr[2], p;
}
L[Nmax];
int P[Lg][Nmax],n,i,stp,cnt,rez,aux,s;
bool cmp(const entry &a, const entry &b)
{
return a.nr[0]==b.nr[0]?(a.nr[1]<b.nr[1]):(a.nr[0]<b.nr[0]);
}
int lcp(int x, int y)
{
int k,ret=0;
if (x==y)
return n-x;
for (k=stp-1;k>=0 && x<n && y<n;--k)
if (P[k][x]==P[k][y])
x+=1<<k,
y+=1<<k,
ret+=1<<k;
return ret;
}
int main()
{
int i,j,k;
freopen(file_in,"r",stdin);
freopen(file_out,"w",stdout);
scanf("%d %d\n", &n,&k);
gets(A);
for (i=0;i<n;++i)
P[0][i]=A[i]-'0';
for (stp=1,cnt=1;(cnt>>1)<n;++stp,cnt<<=1)
{
for (i=0;i<n;++i)
{
L[i].nr[0]=P[stp-1][i];
L[i].nr[1]=i+cnt<n?P[stp-1][i+cnt]:-1;
L[i].p=i;
}
sort(L,L+n,cmp);
for (i=0;i<n;++i)
P[stp][L[i].p]=i>0 && L[i].nr[0]==L[i-1].nr[0] && L[i].nr[1]==L[i-1].nr[1]?P[stp][L[i-1].p]:i;
}
int rez=0;
for(i=0;i+k-1<n;++i)
{
aux=lcp(L[i].p,L[i+k-1].p);
if(aux>rez)
rez=aux;
}
printf("%d\n",rez);
fclose(stdin);
fclose(stdout);
return 0;
}