[思维] aw3789. 隐藏字符串(脑筋急转弯+枚举+递推+aw周赛010_3)

1. 题目来源

链接:3789. 隐藏字符串

2. 题目解析

猜结论就行了。最优解一定是长度为 1 的,或者长度为 2 的子串。

因为如果长度大于 3 并且还是等差数列的话,那么长度为 1、2 的子串一定也包含在其中,所以,所以最优解一定在长度为 1、2 的子串中包含的有。

计算:

  • 长度为 1:直接遍历每个字母取出现次数最高的即可。
  • 长度为 2:前缀和 f[i][j] 统计字母 ij 出现的次数,因为仅有 26 * 26 种情况。
  • 即,假设当前枚举的是以字符 x,结尾的字符串,那么以 ax, bx, cx,...,xx, yx, zx 这 26 种情况均以 x 作为结尾,它们分别出现的次数就是 a,b,c,...,x,y,z 这些字符所出现的次数。
  • 故,仅需统计一个字符出现次数的 s 数组,和 f[26][26] 的所有长度为 2 的出现次数统计即可。
  • 注意在枚举当前位置 t 时,不要先将其计数,应该是计算完 f[][] 的所有状态之后再对其计数,s[t] ++因为以 t 结尾,那么必然 t 不能成为自己的开头,所以不能计数。

时间复杂度: O ( 26 n ) O(26n) O(26n)

空间复杂度: O ( 26 ∗ 26 ) O(26*26) O(2626)


枚举所有长度为 2 的字符串出现次数即可。

#include <bits/stdc++.h>

using namespace std;

using LL = long long;

LL s[26], f[26][26];

int main() {
    string str;
    cin >> str;
    
    LL res = 0;
    for (char i : str) {
        int t = i - 'a';
        for (int j = 0; j < 26; j ++ ) {
            f[j][t] += s[j];                    // 以t结尾的长度为2的字符串出现次数
            res = max(res, f[j][t]);            // 长度为2,更新答案
        }
        s[t] ++ ;               // 在后面累加s[t]++,枚举以自己结尾的字符串时,自己不应该加入计数中       
        res = max(res, s[t]);                   // 长度为1,更新答案
    }
    
    cout << res << endl;
    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ypuyu

如果帮助到你,可以请作者喝水~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值