codeforces1307C. Cow and Message

题目链接: 老师永远不知道学生上网课在干嘛系列

找出某字符串中出现最多出现子串的次数,其中子串的下表需构成等差数列


根据观察可得,出现次数最多的子串长度不会超过2,所以只需要统计这两种情况就可以了
长度为1:统计字符串中出现的次数
长度为2:DP,详见代码,我觉得的挺好理解的,就不解释了

这个是上课写的,所以很有的地方是可以合并到一个循环里的,但是下课了就懒得改了

#pragma GCC diagnostic error "-std=c++11"
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define Pair pair<int,int>
#define re return

#define getLen(name,index) name[index].size()
#define mem(a,b) memset(a,b,sizeof(a))
#define Make(a,b) make_pair(a,b)
#define Push(num) push_back(num)
#define rep(index,star,finish) for(register int index=star;index<finish;index++)
#define drep(index,finish,star) for(register int index=finish;index>=star;index--)
using namespace std;

template<class T> void _deb(const char *name,T val){
    cout<<name<<val<<endl;
}

const int maxn=1e5+5;

char store[maxn];
ll statistics[maxn][26];
ll sum[26][26];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    ll ans=0;
    cin>>store+1;
    int len;
    rep(i,1,maxn){
        if(!store[i]){
            len=i;
            break;
        }
        statistics[i][store[i]-'a']+=1;
        rep(j,0,26){
            statistics[i][j]+=statistics[i-1][j];
        }
    }

    rep(i,0,26)
        ans=max(ans,statistics[len-1][i]);

    rep(i,1,len){
        int pos=store[i]-'a';
        rep(j,0,26){
            sum[j][pos]+=statistics[i-1][j];
        }
    }

    rep(i,0,26)
        rep(j,0,26)
            ans=max(ans,sum[i][j]);

    cout<<ans<<endl;

    re 0;
}

猜你喜欢

转载自blog.csdn.net/white_156/article/details/104514282
今日推荐