Pagini recente » Cod sursa (job #1852848) | Cod sursa (job #1785067) | Cod sursa (job #1984465) | Cod sursa (job #2045395) | Cod sursa (job #712091)
Cod sursa(job #712091)
#include <cstdio>
#include <algorithm>
using namespace std;
#define nmax 16390
char s[nmax];
int n, k, p[20][nmax], ans, u[nmax], c[nmax], u2[nmax];
struct nr
{
int x, y, p;
} v[nmax];
int cmp (nr a, nr b)
{
if (a.x == b.x) return a.y<b.y;
return a.x<b.x;
}
int main()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d %d\n", &n, &k);
int i, step, cnt, ok, prev;
fgets(s, nmax, stdin);
for (i=0; i<n; i++) p[0][i] = s[i] - 'a';
for (step=1, cnt=1; (cnt>>1) <n; step++, cnt<<=1)
{
for (i=0; i<n; i++)
{
v[i].x = p[step-1][i];
if (i+cnt<n) v[i].y = p[step-1][i+cnt]; else
v[i].y = -1;
v[i].p = i;
}
sort (v, v+n, cmp);
for (i=0; i<n; i++)
if (v[i].x == v[i-1].x && v[i].y == v[i-1].y)
p[step][v[i].p] = p[step][v[i-1].p]; else
p[step][v[i].p] = i;
}
prev=0;
for (step=0, cnt=1; cnt <= n; cnt<<=1, step++);
step--;
cnt>>=1;
for (i=0; i<n; i++) u[i]=1;
for (ans=0; cnt; cnt >>= 1, step--)
{
for (i=0; i<n; i++) c[i]=0;
for (i=prev; i<n; i++)
if (u[i-prev])
c[p[step][i]]++;
ok=0;
for (i=0; i<n; i++)
if (c[p[step][i]]>=k) ok=1;
if (ok)
{
for (i=0; i<n; i++) u2[i]=0;
for (i=prev; i<n; i++)
if (u[i-prev])
if (c[p[step][i]]>=k) u2[i]=1;
for (i=0; i<n; i++) u[i]=u2[i];
ans+=cnt;
prev=cnt;
}
}
printf("%d\n",ans);
}