2020牛客寒假算法基础集训营2——B.排数字【简单题】

题目传送门


题目描述

子串是连续的。
牛可乐 最喜爱的字符串是 616 \text{616}

牛可乐得到了一个纯数字的字符串 S \text{}S ,他想知道在可以任意打乱 S \text{}S 顺序的情况下,最多有多少个不同的子串为 616 \text{616}

当两个子串 S [ l 1 r 1 ] , S [ l 2 r 2 ] S[l_1\dots r_1], S[l_2\dots r_2] 满足 l 1 l 2 l_1\neq l_2 r 1 r 2 r_1\neq r_2 时它们被认为是不同的。


输入描述:

第一行,一个正整数 |S|,表示 S 的长度。
第二行,一个字符串 S,其字符集为 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}。
保证 1 S 2 × 1 0 5 1 ≤ |S| ≤ 2 × 10^5


输出描述:

输出一行,一个整数表示答案。


输入

11
11451419266

输出

1

说明

一种最优打乱方案为 “11451492616”,有一个子串为 “616” 。


题解

  • 1 1 6 6 以外不需要考虑。

  • 要让 616 616 子串最多一定是 61616 61616… ,这样后面的串可以用前面的 6 6 ,数量为 min ( cnt 6 1 , cnt 1 ) \min(\text{cnt}_6-1, \text{cnt}_1) 。(可以理解为前面一个 6 6 后面 616 616 循环)

  • 时间复杂度 O ( S ) O(|S|)


AC-Code

#include <bits/stdc++.h>
using namespace std;

char s[200005]; int cnt[10], n;
int main() {
    scanf("%d%s", &n, s);
    for (int i = 0; i < n; ++i)     ++cnt[s[i] - '0'];
    cout << min(cnt[6] - 1, cnt[1]);
    return 0;
}
发布了157 篇原创文章 · 获赞 99 · 访问量 9817

猜你喜欢

转载自blog.csdn.net/Q_1849805767/article/details/104200179