codeforce div1+2 621 C.cow message

在这里插入图片描述输出标准输出 牛贝西刚刚截获了一条农夫约翰发给汉堡王的短信!然而,贝西确信里面隐藏着一个秘密信息。 文本是由小写拉丁字母组成的字符串。她认为字符串T隐藏在字符串S中,如果T作为S的子序列存在,则S的索引构成算术级数。例如,字符串aab隐藏在字符串aaabb中,因为它出现在索引1、3和5处,这些索引形成一个算术级数,其公共差分为2。贝西认为任何出现次数最多的隐藏字符串都是秘密消息。如果索引集不同,则S的子序列的两次出现是不同的。帮她找出这条秘密消息的出现次数! 例如,在字符串a a abb中,a隐藏3次,b隐藏2次,ab隐藏6次,aa隐藏3次,bb隐藏1次,aab隐藏2次,aaa隐藏1次,abb隐藏1次,aaab隐藏1次,aabb隐藏1次,aaabb隐藏1次。机密消息的出现次数为6。 输入 第一行包含一个小写拉丁字母字符串s(1≤| s |≤105)-贝西截取的文本。 输出 输出单个整数-出现机密消息的次数。

这道题看上去需要处理很多情况的比较,但观察后不难发现,所有长度大于2的答案一定小于等于等于2或1的答案,所以我们只需考虑1个或2个长度的字符串即可,那么我们先建一个数组存储到目前为止该字符出现的次数,在使用2维数组结合循环对每个位置,针对其前面的26个字符进行组合,实时更新最大值,即可的到所有长度为二的可行字符串,在循环每一次结束前在多比较一次单个字符串出现次数,即可保证答案为长度1或2中最大值。

#include <bits/stdc++.h>
using namespace std;
long long b[500][500],c[500],ans=0;
string s;
main(){
    cin>>s;
    for(int i=0;i<s.size();i++){
        for(int q ='a';q <='z';q++){
            b[q][s[i]]+=c[q];
            ans=max(ans,b[q][s[i]]);}
        c[s[i]]++;
        ans=max(ans,c[s[i]]);}
    cout << ans<<endl;}
发布了48 篇原创文章 · 获赞 17 · 访问量 4459

猜你喜欢

转载自blog.csdn.net/weixin_45757507/article/details/104375517