题目链接:https://vjudge.net/contest/349730#problem/B
题目:
给出一个01字符串,要求求出多少个区间满足区间内存在si = si+k,且si+k = si+k×2。
输出所有满足条件的区间的数量。
思路:
每次枚举左右区间端点l,r,如果当前区间范围满足条件,则以l为起点的左区间的贡献是n-r。
一开始看到区间这么大不敢这样做。
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 3e5+10;
char ss[N];
int main(void)
{
scanf("%s",ss);
int n = strlen(ss);
long long ans = 0;
for(int l=0;l<n;l++)
{
for(int r=l+1;r<n;r++)
{
bool fg = false;
for(int k=1;r-2*k>=l;k++)
{
if(ss[r] == ss[r-k] && ss[r-k] == ss[r-k*2])
{
ans += n-r;
fg = true;break;
}
}
if(fg == true) break;
}
}
printf("%lld\n",ans);
return 0;
}