Pagini recente » Cod sursa (job #119759) | Diferente pentru implica-te/arhiva-educationala intre reviziile 105 si 104 | Cod sursa (job #824384) | Cod sursa (job #2954398) | Cod sursa (job #426092)
Cod sursa(job #426092)
#include <stdio.h>
#include <algorithm>
#define IN "substr.in"
#define OUT "substr.out"
#define Lg 17000
using namespace std;
struct lol
{
int nr[2],p;
}L[Lg];
struct cmp
{
bool operator()(const lol &a,const lol &b)const
{
return a.nr[0]==b.nr[0]? a.nr[1]<b.nr[1]: a.nr[0]<b.nr[0];
}
};
int M[17][Lg],cnt=1,stp=1,n,k;
char s[Lg];
void solve()
{
for (int i=0;i<n;i++)
M[0][i]=s[i]-'0';
for (;(cnt>>1) < n; cnt<<=1, stp++)
{
for (int i=0;i<n;i++)
{
L[i].nr[0]=M[stp-1][i];
L[i].nr[1]=i+stp<n ? M[stp-1][i+stp]:-1;
L[i].p=i;
}
sort(L,L+n,cmp());
for (int i=0;i<n;i++)
M[stp][L[i].p]= i>0 &&L[i].nr[0]==L[i-1].nr[0] && L[i].nr[1]==L[i-1].nr[1] ?M[stp][L[i-1].p]:i;
}
stp--;
}
int lcp(int x,int y)
{
int rez=0;
if (x==y)
return n-x;
for (int i=stp;i>=0 && x<n && y<n; i--)
{
if (M[i][x]== M[i][y])
{
x+=1<<i;
y+=1<<i;
rez+=1<<i;
}
}
return rez;
}
void afish()
{
int aux,Rez=0;
for (int 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);
}
int main ()
{
freopen (IN ,"r", stdin);
freopen (OUT,"w", stdout);
scanf ("%d %d\n",&n,&k);
fgets(s,Lg,stdin);
solve();
afish();
return 0;
}