/*

    slozenost: O (n log n)
    koristi segmentna stabla

*/

#include <stdio.h>

struct segCvor
{
    int levodeteidx, desnodeteidx;
    bool list;
    int max;
    int maxidx;
    int levagr, desnagr;
    int najlevidx;
} cvorovi [800000];

int n, m;
int idx;
char s [300050];
int sol [300000];
int razl;
int trenmax;
int trennajlev;

void FormirajSegmentno (int levagranica, int desnagranica)
{
    int tidx = idx;
    cvorovi [tidx].levagr = levagranica;
    cvorovi [tidx].desnagr = desnagranica;
    cvorovi [tidx].max = 0;
    cvorovi [tidx].najlevidx = -1;
    if (levagranica == desnagranica)
    {
        cvorovi [tidx].list = true;
    }
    else
    {
        idx++;
        cvorovi [tidx].levodeteidx = idx;
        FormirajSegmentno (levagranica, (levagranica + desnagranica) / 2);
        idx++;
        cvorovi [tidx].desnodeteidx = idx;
        FormirajSegmentno (1 + (levagranica + desnagranica) / 2, desnagranica);
        cvorovi [tidx].list = false;
    }
}

void RadiSegmentno (int desnagr, int idxniza, int otac)
{
    if (cvorovi [otac].desnagr <= desnagr)
    {
        if (cvorovi [otac].max > sol [idxniza])
        {
            sol [idxniza] = cvorovi [otac].max;
        }
    }
    else
    {
        if (!cvorovi [otac].list)
        {
            RadiSegmentno (desnagr, idxniza, cvorovi [otac].levodeteidx);
            if (cvorovi [cvorovi [otac].desnodeteidx].levagr <= desnagr)
            {
                RadiSegmentno (desnagr, idxniza, cvorovi [otac].desnodeteidx);
            }
        }
    }
    if (cvorovi [otac].desnagr <= desnagr)
    {
        if (cvorovi [otac].max == sol [idxniza])
        {
            if (cvorovi [otac].najlevidx < trennajlev)
            {
                trennajlev = cvorovi [otac].najlevidx;
            }
        }
    }
}

void UpdateSegmentno (int desnagr, int idxniza, int otac)
{
    if (!cvorovi [otac].list)
    {
        if (cvorovi [cvorovi [otac].desnodeteidx].levagr <= desnagr)
        {
            UpdateSegmentno (desnagr, idxniza, cvorovi [otac].desnodeteidx);
        }
        else
        {
            UpdateSegmentno (desnagr, idxniza, cvorovi [otac].levodeteidx);
        }
    }
    if (cvorovi [otac].desnagr >= desnagr)
    {
        if (cvorovi [otac].max < sol [idxniza])
        {
            cvorovi [otac].max = sol [idxniza];
            cvorovi [otac].najlevidx = idxniza;
        }
    }
}

int main ()
{
    FILE *in = fopen ("muzej.in", "r");
    fscanf (in, "%d %d", &n, &m);
    FormirajSegmentno (0, n - 1);
    fscanf (in, "%s", &s);
    fclose (in);
    for (int i = 0; i < n; i++)
    {
        if (s [i] == 'a')
        {
            razl++;
        }
        else
        {
            razl--;
        }
        if (razl >= 0)
        {
            sol [i] = 0;
            trennajlev = i;
            RadiSegmentno (razl, i, 0);
            sol [i]++;
            UpdateSegmentno (razl, i, 0);
        }
        else
        {
            sol [i] = 0;
        }
        if (i == m - 1)
        {
            trenmax = sol [m - 1];
        }
        else
        {
            if (i >= m)
            {
                if (sol [i] > trenmax && trennajlev < m - 1)
                {
                    trenmax = sol [i];
                }
            }
        }
    }
    FILE *out = fopen ("muzej.out", "w");
    printf ("%d", trenmax - 1);
    fclose (out);
    return 0;
}
