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(思维求贡献)的主要内容,如果未能解决你的问题,请参考以下文章
1523 E - Crypto Lights(期望+组合数学思维)