Codeforces Round #621 (Div. 1 + Div. 2) Cow and Message

解题报告:

1:答案在单个字符或者两个字符组成的子串答案中。

2:比如aaabb这个样例:定义一个cnt数组,记录每个字符出现的次数。还有dp数组,记录两个字符的组成的子串出现的次数。

处理到下标0:dp数组先更新,但cnt数组为0,所以dp还是0。更新cnt数组,cnt[0]++,cnt[0] = 1。

处理到下标1:dp数组先更新,dp[0][0] += cnt[0],dp[0][0] = 1,其他还是0。更新cnt数组,cnt[0]++,cnt[0] = 2。

处理到下标2:dp数组先更新,dp[0][0] += cnt[0],dp[0][0] = 3,其他还是0。更新cnt数组,cnt[0]++,cnt[0] = 3。

处理到下标3:dp数组先更新,dp[1][0] += cnt[0],dp[1][0] = 3。更新cnt数组,cnt[1]++,cnt[1] = 1。

处理到下标4:dp数组先更新,dp[1][0] += cnt[0],dp[1][0] = 6。dp[1][1] += cnt[1],dp[1][1] = 1。更新cnt数组,cnt[1]++,cnt[1] = 2。

到此结束。dp数组最大值:6,cnt数组最大值:3,所以答案:6。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 1e5+10;
char ss[N];
ll dp[26][26], cnt[26];
int main(){
    while(~scanf("%s", ss)){
        memset(dp, 0, sizeof(dp));
        memset(cnt, 0, sizeof(cnt));
        ll len = strlen(ss);
        ll maxn = 0;
        for(ll i=0; i<len; ++i){
            ll c = ss[i] - 'a';
            for(ll j=0; j<26; ++j){
                dp[c][j] += cnt[j];
                maxn = max(maxn, dp[c][j]);
            }
            maxn = max(maxn, ++cnt[c]);
        }
        printf("%lld\n", maxn);
    }
    return 0;
}
发布了206 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/jun_____/article/details/104422570