Pagini recente » Cod sursa (job #666920) | Cod sursa (job #1853098) | Cod sursa (job #820354) | Cod sursa (job #2175935) | Cod sursa (job #1414421)
#include <cstdio>
#include <algorithm>
#define Nmax 17000
using namespace std;
struct el
{
int v1,v2,poz;
bool operator <(const el A) const
{
if(v1==A.v1) return v2<A.v2;
return v1<A.v1;
}
bool operator == (const el A) const
{
return (v1==A.v1 && v2==A.v2);
}
} L[Nmax];
char sir[Nmax];
int n,dp[Nmax][20];
inline void SuffArrays()
{
int i,len,j;
for(i=1;i<=n;++i) dp[i][0]=sir[i]-'0';
for(i=1;(1<<(i-1))<=n;++i)
{
len=0;
for(j=1;j<=n;++j)
{
el w;
w.poz=j; w.v1=dp[j][i-1];
if(j+(1<<(i-1))>n) w.v2=-1;
else w.v2=dp[j+(1<<(i-1))][i-1];
L[++len]=w;
}
sort(L+1,L+len+1);
dp[L[1].poz][i]=0;
for(j=2;j<=n;++j)
{
dp[L[j].poz][i]=dp[L[j-1].poz][i];
if(!(L[j]==L[j-1])) ++dp[L[j].poz][i];
}
}
}
inline int LCP(int p1, int p2)
{
int i,sol=0;
for(i=20;i>=0;--i)
{
if(p1+(1<<i)-1>n || p2+(1<<i)-1>n) continue;
if(dp[p1][i]==dp[p2][i])
{
p1+=(1<<i); p2+=(1<<i); sol+=(1<<i);
}
}
return sol;
}
int main()
{
int k,sol=0,i;
freopen ("substr.in","r",stdin);
freopen ("substr.out","w",stdout);
scanf("%d%d%s", &n,&k,(sir+1));
SuffArrays();
for(i=k;i<=n;++i)
sol=max(sol,LCP(L[i-k+1].poz,L[i].poz));
printf("%d\n", sol);
return 0;
}