Pagini recente » Cod sursa (job #369862) | Cod sursa (job #2494163) | Cod sursa (job #3156539) | Cod sursa (job #83686) | Cod sursa (job #3260063)
#include <fstream>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream cin("subst.in");
ofstream cout("subst.out");
struct numar
{
int poz,nri,nrf;
}l[16400];
int n,k,p[17][16400],power,s[16400],lung;
char c[16400];
int cmp(numar a,numar b)
{
if(a.nri==b.nri)
return a.nrf<b.nrf;
else
return a.nri<b.nri;
}
int lcp(int x,int y)
{
if(x==y)
return n-x;
int sol=0;
for(int k=power-1;k>=0 && x<n && y<n;k--)
if(p[k][x]==p[k][y])
x+=(1<<k),y+=(1<<k),sol+=(1<<k);
return sol;
}
int main()
{
cin>>n>>k>>c;
for(int i=0;i<n;i++)
p[0][i]=c[i]-'0';
for(int lg=1;lg<=n;lg*=2)
{
for(int i=0;i<n;i++)
{
l[i].poz=i;
l[i].nri=p[power][i];
if(i+lg<n)
l[i].nrf=p[power][i+lg];
else
l[i].nrf=-1;
}
sort(l,l+n,cmp);
for(int i=0;i<n;i++)
if(i>0 && l[i].nri==l[i-1].nri && l[i].nrf==l[i-1].nrf)
p[power+1][l[i].poz]=p[power+1][l[i-1].poz];
else
p[power+1][l[i].poz]=i;
power++;
}
for(int i=0;i<n;i++)
s[p[power][i]]=i;
for(int i=0;i+k-1<n;i++)
lung=max(lung,lcp(s[i],s[i+k-1]));
cout<<lung;
return 0;
}