牛客春招刷题训练营-2025.4.14题解

活动地址: 牛客春招刷题训练营 - 编程打卡活动

简单题 自守数

题意即判断 内含多少 使得
注意特判 ,因为 无定义。

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n;
    cin >> n;
    int ans = 1;
    for (int i = 1; i <= n; i++) {
        int square = i * i;
        int digit = log10(i) + 1;
        int mod = 1;
        while (digit--)mod *= 10;
        if (square % mod == i)ans++;
    }
    cout << ans << '\n';
    return 0;

}

中等题 小红的双生串

将字符串截成前后两段,两段分别变成这一段出现次数最多的字符。

#include <bits/stdc++.h>
using namespace std;
int main() {
    string s;
    cin >> s;
    int cnt1[26] = {}, cnt2[26] = {};
    int n = s.length();
    for (int i = 0; i < n; i++) {
        if (i < n / 2)cnt1[s[i] - 'a']++;
        else cnt2[s[i] - 'a']++;
    }
    int max1 = *max_element(cnt1, cnt1 + 26);
    int max2 = *max_element(cnt2, cnt2 + 26);
    cout << n - max1 - max2 << '\n';
    return 0;
}

困难题 abb

倒序遍历,我们遍历 a 找 bb。
设截止到位置 的后缀的 b 的出现次数为 ,则共有 种组合可以组合成 bb。
当前位置所加贡献为 ,注意 不能等于
然后

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n;
    cin >> n;
    string s;
    cin >> s;
    int cnt[26] = {};
    long long ans = 0;
    for (int i = n - 1; i >= 0; i--) {
        for (int j = 0; j < 26; j++) {
            if (j == s[i] - 'a')continue;
            ans += (cnt[j]) * (cnt[j] - 1) / 2;
        }
        cnt[s[i] - 'a']++;
    }
    cout << ans << '\n';
}
#牛客春招刷题训练营#
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务