Pagini recente » Cod sursa (job #1500902) | Cod sursa (job #2772565) | Cod sursa (job #2145188) | Cod sursa (job #1053726) | Cod sursa (job #96021)
Cod sursa(job #96021)
using namespace std;
#include<cstdio>
#include<algorithm>
#include<utility>
#define Nm (1<<15)
#define Lognm 16
char S[Nm];
int P[Lognm][Nm],n,k;
struct entry
{
int p;
pair<int,int> nr;
} L[Nm];
void read()
{
freopen("substr.in","r",stdin);
scanf("%d%d ",&n,&k);
gets(S);
}
bool cmp(entry a, entry b)
{
return a.nr<b.nr;
}
int solve()
{
int A[Nm],stp,cnt,i,l;
if(k==1)
return n;
for(i=0;i<n;++i)
P[0][i]=S[i];
for(stp=1,cnt=1;cnt<n;++stp,cnt<<=1)
{
for(i=0;i<n;++i)
{
L[i].p=i;
L[i].nr=make_pair(P[stp-1][i],i+cnt<n?P[stp-1][i+cnt]:-1);
}
sort(L,L+n,cmp);
P[stp][L[0].p]=0;
for(i=1;i<n;++i)
P[stp][L[i].p]=L[i].nr==L[i-1].nr?P[stp][L[i-1].p]:i;
}
for(l=i=0;i<n;++i)
A[i]=-1;
for(--stp;stp>=0;--stp)
{
for(i=0;i<n;++i)
{
L[i].p=i;
L[i].nr=make_pair(A[i],i+l<n?P[stp][i+l]:-1);
}
sort(L,L+n,cmp);
for(cnt=i=1;i<n;++i)
if(L[i].nr==L[i-1].nr)
++cnt;
else
{
if(cnt>=k)
break;
cnt=1;
}
if(cnt>=k)
{
A[L[0].p]=0;
for(i=1;i<n;++i)
A[L[i].p]=L[i].nr==L[i-1].nr?A[L[i-1].p]:i;
l|=1<<stp;
}
}
return l;
}
void write(int ans)
{
freopen("substr.out","w",stdout);
printf("%d\n",ans);
}
int main()
{
read();
write(solve());
return 0;
}