using
System;
using
System.Collections.Generic;
class
GFG {
static
int
countSubstrings(
string
str)
{
Dictionary<Tuple<Tuple<
int
,
int
>,
Tuple<
int
,
int
>>,
int
> mp =
new
Dictionary<Tuple<Tuple<
int
,
int
>,
Tuple<
int
,
int
>>,
int
>();
if
(mp.ContainsKey(
new
Tuple<Tuple<
int
,
int
>,
Tuple<
int
,
int
>>(
new
Tuple<
int
,
int
>(0, 0),
new
Tuple<
int
,
int
>(0, 0))))
{
mp[
new
Tuple<Tuple<
int
,
int
>,
Tuple<
int
,
int
>>(
new
Tuple<
int
,
int
>(0, 0),
new
Tuple<
int
,
int
>(0, 0))]++;
}
else
{
mp[
new
Tuple<Tuple<
int
,
int
>,
Tuple<
int
,
int
>>(
new
Tuple<
int
,
int
>(0, 0),
new
Tuple<
int
,
int
>(0, 0))] = 1;
}
int
p = 0;
int
q = 0;
int
r = 0;
int
s = 0;
int
cntSub = 0;
for
(
int
i = 0; i < str.Length; i++) {
if
(str[i] ==
'a'
) {
p++;
int
Y = Math.Min(Math.Min(s, r),
Math.Min(p, q));
p -= Y;
q -= Y;
r -= Y;
s -= Y;
}
else
if
(str[i] ==
'b'
) {
q++;
int
Y = Math.Min(Math.Min(p, q),
Math.Min(r, s));
p -= Y;
q -= Y;
r -= Y;
s -= Y;
}
else
if
(str[i] ==
'c'
) {
r++;
int
Y = Math.Min(Math.Min(p, q),
Math.Min(r, s));
p -= Y;
q -= Y;
r -= Y;
s -= Y;
}
else
if
(str[i] ==
'd'
) {
s++;
int
Y = Math.Min(Math.Min(p, q),
Math.Min(r, s));
p -= Y;
q -= Y;
r -= Y;
s -= Y;
}
if
(mp.ContainsKey(
new
Tuple<Tuple<
int
,
int
>,
Tuple<
int
,
int
>>(
new
Tuple<
int
,
int
>(p, q),
new
Tuple<
int
,
int
>(r, s))))
{
mp[
new
Tuple<Tuple<
int
,
int
>,
Tuple<
int
,
int
>>(
new
Tuple<
int
,
int
>(p, q),
new
Tuple<
int
,
int
>(r, s))]++;
}
else
{
mp[
new
Tuple<Tuple<
int
,
int
>,
Tuple<
int
,
int
>>(
new
Tuple<
int
,
int
>(p, q),
new
Tuple<
int
,
int
>(r, s))] = 1;
}
}
foreach
(KeyValuePair<Tuple<Tuple<
int
,
int
>,
Tuple<
int
,
int
>>,
int
> e
in
mp)
{
int
freq = e.Value;
cntSub += (freq) * (freq - 1) / 2;
}
return
cntSub;
}
static
void
Main()
{
string
str =
"abcdefg"
;
Console.WriteLine(countSubstrings(str));
}
}