E - Good Triple(思维求贡献)

Posted CCSU_Cola

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了E - Good Triple(思维求贡献)相关的知识,希望对你有一定的参考价值。

题目链接

题意:给一个只包含0和1的字符串S,问在字符串中有多少个区间[L,R]包含S[l]==s[l+k]==s[l+2*k],且L<=l,l+2*k<=R。

思路:因为只包含0和1两种字符,可以知道不构成题目条件的串的长度不会大于9,也就是说只需要暴力求解即可,枚举以L为起点,得到满足条件的最小R。答案加上strlen(s)-R+1即可。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=300010;
char a[maxn];
int main(){
    scanf("%s",a+1);
    int k=strlen(a+1);
    ll r=k+2,ans=0;
    for(int i=k-1;i>=1;i--){
        for(int j=1;i+j*2<=k;j++){
            if(a[i]==a[i+j]&&a[i]==a[i+2*j]){
                r=min(r,(1ll)*i+j*2);//找到最小的R
                break;
            }
        }
        ans+=max(k-r+1,0ll);
    }
    printf("%lld\\n",ans);
}

以上是关于E - Good Triple(思维求贡献)的主要内容,如果未能解决你的问题,请参考以下文章

CF1168B Good Triple

[CF1168B] Good Triple

2018山东省赛 E Sequence ( 思维 )

1523 E - Crypto Lights(期望+组合数学思维)

A. Nastia and Nearly Good Numbers(思维)

2020 China Collegiate Qinhuangdao Site G. Good Number(分段算贡献)