CF1550E Stringforces

题目描述

给定一个长度为 $n$ 的字符串 $s$。每个字符要么是前 $k$ 个小写拉丁字母之一,要么是问号。 你需要将每个问号替换为前 $k$ 个小写拉丁字母中的某一个,使得下述值最大化。 令 $f_i$ 表示字符串 $s$ 中完全由第 $i$ 个拉丁字母组成的最长子串的长度。字符串的子串是该字符串的一个连续子序列。如果第 $i$ 个字母没有出现在字符串中,则 $f_i = 0$。 字符串 $s$ 的值定义为所有 $f_i$($i$ 从 $1$ 到 $k$)中的最小值。 请问,在将所有问号替换为前 $k$ 个小写拉丁字母后,字符串的最大可能值是多少。

输入格式

第一行包含两个整数 $n$ 和 $k$($1 \le n \le 2 \cdot 10^5$;$1 \le k \le 17$),分别表示字符串的长度和使用的前 $k$ 个拉丁字母的数量。 第二行包含一个长度为 $n$ 的字符串 $s$,每个字符要么是前 $k$ 个小写拉丁字母之一,要么是问号。

输出格式

输出一个整数,表示在将所有问号替换为前 $k$ 个小写拉丁字母后,字符串的最大可能值。

说明/提示

在第一个样例中,问号可以替换为如下方式:"aaaababbbb"。此时 $f_1 = 4$,$f_2 = 4$,因此答案为 $4$。也可以替换为:"aaaabbbbbb"。此时 $f_1 = 4$,$f_2 = 6$,但它们的最小值仍然是 $4$。 在第二个样例中,其中一种可能的字符串为 "aabbccdda"。 在第三个样例中,至少有一个字母不会出现在字符串中,因此所有 $f_i$ 的最小值始终为 $0$。 由 ChatGPT 4.1 翻译