- 题意
给定 T T T组字符串,求只有一个字母的连续子串的数量
- 思路
统计一下所有连续只有一个字母的子串的长度 L i L_i Li存到数组中,结果就是 ∑ i = 1 n ( L i + 1 ) ∗ L i / 2 \sum_{i = 1}^{n}(L_i + 1) *L_i/2 ∑i=1n(Li+1)∗Li/2,注意一下结果可能爆int要开long long。
- 代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int N = 1e5 + 10;
char s[N];
int a[N];
int main() {
int t;
cin >> t;
while(t--) {
scanf("%s", s);
int l = strlen(s);
int cnt = 1;
int len = 0;
for(int i = 1;i < l;i++) {
if(s[i] == s[i - 1]) {
cnt++;
}
else {
a[len++] = cnt;
cnt = 1;
}
}
a[len++] = cnt;
long long res = 0;
for(int i = 0;i < len;i++) {
res += 1ll * (1 + a[i]) * a[i] / 2;
}
printf("%lld\n", res);
}
}