Pagini recente » Cod sursa (job #2986939) | Cod sursa (job #895172) | Cod sursa (job #2898382) | Cod sursa (job #2905165) | Cod sursa (job #528486)
Cod sursa(job #528486)
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std;
vector <pair<pair<int,int>,int> > v;
int N,K,i,j,k,pow,ind,sol,nr;
char sir[16388];
int aux[16388];
int main()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d %d\n",&N,&K);
fgets(sir,N+3,stdin);
N--;
for(i=0;i<=N;i++)
v.push_back(make_pair(make_pair((int)sir[i],0),i));
sort(v.begin(),v.end());
pow=1;
while(pow<=N)
{
memset(aux,0,sizeof(aux));
ind=0;
aux[v[0].second]=0;
for(i=1;i<=N;i++)
{
if(v[i].first.first!=v[i-1].first.first) ind++;
else
if(v[i].first.second!=v[i-1].first.second) ind++;
aux[v[i].second]=ind;
}
for(i=0;i<=N;i++)
{
v[i].second=i;
v[i].first.first=aux[i];
if(i+pow<=N) v[i].first.second=aux[i+pow];
else v[i].first.second=-1;
}
sort(v.begin(),v.end());
pow*=2;
}
sol=0;
for(i=0;i<=N-K+1;i++)
{
nr=0;
j=v[i].second;
k=v[i+K-1].second;
while(j<=N&&k<=N&&sir[j]==sir[k]) j++,k++,nr++;
if(nr>sol) sol=nr;
}
printf("%d\n",sol);
return 0;
}