def cnt(vec, m):
    # vec: 当前字母的所有位置列表 (vec存储了某一个字母出现在字符串中的位置)
    # m:   允许的最大交换次数
    n = len(vec)  # n 是这个字母在字符串中出现的次数
    
    # 初始化一个二维dp数组,dp[i][j]表示从位置i到位置j所有字符排列成连续的最小交换代价
    dp = [[0] * n for _ in range(n)]
    
    # 初始化相邻两个位置之间的交换代价。
    # abs(vec[i + 1] - vec[i]) 是位置差,减1是为了计算需要的交换次数。
    for i in range(n - 1):
        dp[i][i + 1] = abs(vec[i + 1] - vec[i]) - 1

    # 通过动态规划计算更长区间的交换代价
    for j in range(2, n):
        for i in range(n - j):
            row, col = i, i + j
            # dp[row][col] 是从 vec[row] 到 vec[col] 的交换代价
            dp[row][col] = dp[row + 1][col - 1] + abs(vec[col] - vec[row]) - j

    max_length = 0  # 用于存储当前字母的最大连续子串长度
    # 遍历所有区间,找到可以通过最多m次交换形成的最大连续子串
    for i in range(n):
        for j in range(i, n):
            if dp[i][j] <= m:  # 如果从位置i到j的代价小于等于m
                max_length = max(max_length, j - i + 1)  # 更新最大长度

    return max_length  # 返回该字母下的最大连续子串长度

def main():
    # 输入
    str_input, m = input().split(' ')  # 输入字符串和交换次数
    m = int(m)  # 转换交换次数为整数
    
    # vec 存储每个字母出现的位置,vec[0] 对应'a',vec[1] 对应'b',以此类推
    vec = [[] for _ in range(26)]

    # 遍历字符串,记录每个字母在字符串中的出现位置
    for i, char in enumerate(str_input):
        vec[ord(char) - ord('a')].append(i)

    max_value = 0  # 用于存储所有字母中能达到的最大连续子串长度
    # 对于每一个字母,计算其能够形成的最大连续子串长度
    for k in range(26):
        if vec[k]:  # 该字母存在于字符串中
            max_value = max(max_value, cnt(vec[k], m))  # 计算并更新最大值

    print(max_value)  # 输出最终结果

if __name__ == "__main__":
    main()