题目大意: 在给定的长度为$n(n\leqslant5\times10^5)$的字符串$A$和字符串$B$中找到最多$k$个字符串,使得这$k$个字符串不同的前缀字符串的数量最多(只包含字符$a$和$b$)。 题解: 考虑给
题目大意:在给定的长度为$n(n\leqslant5\times10^5)$的字符串$A$和字符串$B$中找到最多$k$个字符串,使得这$k$个字符串不同的前缀字符串的数量最多(只包含字符$a$和$b$)。
题解:考虑给这$k$个字符串建一个$trie$树,答案就是它所含的节点数,考虑贪心,在每一层尽可能多的分叉。注意一层最多只能有$k$个点
卡点:无
C++ Code:
#include <cstdio> #define maxn 500010 int n, k; long long ans; char A[maxn], B[maxn]; int main() { scanf("%d%d", &n, &k); scanf("%s%s", A, B); long long now = 1; for (int i = 0; i < n; ++i) { now <<= 1; now -= (A[i] == ‘b‘) + (B[i] == ‘a‘); if (now >= k) { printf("%lld\n", ans + static_cast<long long> (n - i) * k); return 0; } ans += now; } printf("%lld\n", ans); return 0; }