Cow and Message

题目链接:http://codeforces.com/contest/1307/problem/C

题意:给你一个字符串,让你求出该字符串的出现最多次的子序列的次数,且子序列的每个序号要是等差数列。

思路:因为子序列的每个序号要是等差数列,所以只要考虑只有一个和两个的子序列,一个的话就是出现最多的字符次数,两个的话可以先预处理下,然后再枚举所有的两个的子序列,             就可以了。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
#include<string>
#include<algorithm>
#include<queue>
#include<map>
typedef long long ll;
using namespace std;
char a[200005];
ll b[200005][30];
int main()
{
    scanf("%s",a+1);
    ll n=strlen(a+1);
    for(int i=1;i<=n;i++)
    {
        int x=a[i]-'a';
        for(int j=0;j<26;j++)
            b[i][j]=b[i-1][j];
        b[i][x]++;
    }
    ll ma=0;
    for(int i=0;i<26;i++)
        ma=max(ma,b[n][i]);
    ll ans=ma;
    ans=max(ans,ma*(ma-1)/2);
    for(int i=0;i<26;i++)
        for(int j=0;j<26;j++)
    {
        if(i==j)
            continue;
        ll sum=0;
        for(int k=n;k>=1;k--)
        {
            if(a[k]==j+'a')
                sum=sum+b[k-1][i];
        }
        ans=max(ans,sum);
    }
    printf("%lld\n",ans);
}

 

posted @ 2020-02-18 22:08  ~zcb  阅读(207)  评论(0编辑  收藏  举报