79练习赛D

回文字D

https://ac.nowcoder.com/acm/contest/11169/D

题目:https://ac.nowcoder.com/acm/contest/11169/D

正解 —— 字符串 hash
比赛的时候用贪心感觉可以,但是没弄出来,赛后正解对拍瞎弄弄出来了。

大概思路:

要使每个长度为的字串都是回文串仅存在两种情况:

  1. 每个字母相同 即:aaaaa...
  2. 为奇数且仅含两个字母重复循环 即:abababababab..

只有以上情况所截取的字符串长度大于
截取字符串长度等于时,该字符串只能为回文串。

之后便可贪心,具体详见代码及注释。

#include <bits/stdc++.h>
using namespace std;
const int N = 1e7 + 7;
char s[N];
int l, r = -1, n, d, tot;
inline bool chk() {
    // 每次考虑截取的长度 l-r
    l = r + 1, r = l + d - 1;
    if (r > n - 1)
        return 0;
    // 取前两个字符 判断是否为 aaaaaa... 或 ababababab...的这种形式
    char a = s[l], b = s[l + 1];
    bool flag = 0;
    // 判断长度为D的是否为回文串
    for (int i = 0; i <= tot; ++i) {
        // 不是回文串 只能截取长度 d-1
        if (s[i + l] != s[r - i])
            return --r, 1;
        // 判断是否是以abababab..循环
        if (!((i & 1 && s[i + l] == b) || (i % 2 == 0 && s[i + l] == a)))
            flag = 1;
    }
    // aaaa....
    if (a == b) {
        for (int i = l; i <= r; ++i)
            if (s[i] != a)
                return 1;
        while (!(r + 1 >= n || s[r + 1] != s[r]))
            ++r;
        return 1;
    }
    // abababab....
    if (a != b) {
        // 如果不是abababa.. 则就是一个简单回文串
        if (flag)
            return 1;
        while (!(r + 1 >= n || (s[r + 1] != a && s[r + 1] != b) ||
                 s[r + 1] == s[r]))
            ++r;
        return 1;
    }
    return 0;
}
int solve() {
    // 每个字符串不考虑特殊情况简单拆分最大长度 d-1
    int maxn = n / (d - 1) + 1, ans = 0;
    tot = d / 2;
    // 循环考虑截取长度
    while (chk())
        ans++;
    // 剩下点小尾巴 也要单独分一段
    if (l < n)
        ans++;
    return min(ans, maxn);
}
int main() {
    scanf("%d%d%s", &n, &d, s);
    // 如果d=1则每个长度为d的字串都是字符串 既不用拆分
    if (n < d || d == 1)
        puts("1");
    else
        printf("%d\n", solve());
    return 0;
}
全部评论

相关推荐

02-22 20:28
重庆大学 Java
程序员牛肉:首先不要焦虑,你肯定是有希望的。 首先我觉得你得好好想一想自己想要什么。找不到开发岗就一定是失败的吗?那开发岗的35岁危机怎么说?因此无论是找工作还是考公我觉得你都需要慎重的想一想。但你一定要避开这样一个误区:“我是因为找不到工作所以不得不选择考公”。 千万不要这么想。你这个学历挺好的了,因此你投后端岗肯定是有面试机会的。有多少人简历写的再牛逼,直接连机筛简历都过不去有啥用?因此你先保持自信一点。 以你现在的水平的话,其实如果想要找到暑期实习就两个月:一个月做项目+深挖,并且不断的背八股。只要自己辛苦一点,五月份之前肯定是可以找到暑期实习的,你有点太过于高看大家之间的技术差距了。不要焦虑不要焦虑。 除此之外说回你这个简历内容的话,基本可以全丢了。如果想做后端,先踏踏实实做两个项目再说+背八股再说。如果想考公,那就直接备战考公。 但是但是就像我前面说的:你考公的理由可以是因为想追求稳定,想追求轻松。但唯独不能是因为觉得自己找不到工作。不能这么小瞧自己和自己的学历。
点赞 评论 收藏
分享
码农索隆:我头回见校招简历把个人优势写在最前面的,是我老了吗
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务