#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
#define main dummy_main
int main( ) {
return 0 ;
}
#undef main
class Solution{
public :
int numberOfSubstrings( string s) {
long long res = 0 ;
int i;
int j;
int N = s.size ( ) ;
int a = 0 ;
int b = 0 ;
int c = 0 ;
j = 0 ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
while ( j < N && ( a== 0 || b== 0 || c== 0 ) ) {
if ( s[ j] == 'a' ) {
a++ ;
}
if ( s[ j] == 'b' ) {
b++ ;
}
if ( s[ j] == 'c' ) {
c++ ;
}
j++ ;
}
if ( a== 0 || b== 0 || c== 0 ) {
break ;
}
res + = N - j + 1 ;
if ( s[ i] == 'a' ) {
a-- ;
}
if ( s[ i] == 'b' ) {
b-- ;
}
if ( s[ i] == 'c' ) {
c-- ;
}
}
return res;
}
}
;
// cLay varsion 20200217-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// class Solution {
// public:
// int numberOfSubstrings(string s) {
// ll res = 0;
// int i, j, N = s.size();
// int a = 0, b = 0, c = 0;
//
// j = 0;
// rep(i,N){
// while(j < N && (a==0 || b==0 || c==0)){
// if(s[j]=='a') a++;
// if(s[j]=='b') b++;
// if(s[j]=='c') c++;
// j++;
// }
// if(a==0 || b==0 || c==0) break;
// res += N - j + 1;
// if(s[i]=='a') a--;
// if(s[i]=='b') b--;
// if(s[i]=='c') c--;
// }
//
// return res;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbWFpbiBkdW1teV9tYWluCmludCBtYWluKCl7CiAgcmV0dXJuIDA7Cn0KI3VuZGVmIG1haW4KY2xhc3MgU29sdXRpb257CiAgcHVibGljOgogIGludCBudW1iZXJPZlN1YnN0cmluZ3Moc3RyaW5nIHMpewogICAgbG9uZyBsb25nIHJlcyA9IDA7CiAgICBpbnQgaTsKICAgIGludCBqOwogICAgaW50IE4gPSBzLnNpemUoKTsKICAgIGludCBhID0gMDsKICAgIGludCBiID0gMDsKICAgIGludCBjID0gMDsKICAgIGogPSAwOwogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIHdoaWxlKGogPCBOICYmIChhPT0wIHx8IGI9PTAgfHwgYz09MCkpewogICAgICAgIGlmKHNbal09PSdhJyl7CiAgICAgICAgICBhKys7CiAgICAgICAgfQogICAgICAgIGlmKHNbal09PSdiJyl7CiAgICAgICAgICBiKys7CiAgICAgICAgfQogICAgICAgIGlmKHNbal09PSdjJyl7CiAgICAgICAgICBjKys7CiAgICAgICAgfQogICAgICAgIGorKzsKICAgICAgfQogICAgICBpZihhPT0wIHx8IGI9PTAgfHwgYz09MCl7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgcmVzICs9IE4gLSBqICsgMTsKICAgICAgaWYoc1tpXT09J2EnKXsKICAgICAgICBhLS07CiAgICAgIH0KICAgICAgaWYoc1tpXT09J2InKXsKICAgICAgICBiLS07CiAgICAgIH0KICAgICAgaWYoc1tpXT09J2MnKXsKICAgICAgICBjLS07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXM7CiAgfQp9CjsKLy8gY0xheSB2YXJzaW9uIDIwMjAwMjE3LTEKCi8vIC0tLSBvcmlnaW5hbCBjb2RlIC0tLQovLyAjZGVmaW5lIG1haW4gZHVtbXlfbWFpbgovLyB7fQovLyAjdW5kZWYgbWFpbgovLyAKLy8gY2xhc3MgU29sdXRpb24gewovLyBwdWJsaWM6Ci8vICAgaW50IG51bWJlck9mU3Vic3RyaW5ncyhzdHJpbmcgcykgewovLyAgICAgbGwgcmVzID0gMDsKLy8gICAgIGludCBpLCBqLCBOID0gcy5zaXplKCk7Ci8vICAgICBpbnQgYSA9IDAsIGIgPSAwLCBjID0gMDsKLy8gCi8vICAgICBqID0gMDsKLy8gICAgIHJlcChpLE4pewovLyAgICAgICB3aGlsZShqIDwgTiAmJiAoYT09MCB8fCBiPT0wIHx8IGM9PTApKXsKLy8gICAgICAgICBpZihzW2pdPT0nYScpIGErKzsKLy8gICAgICAgICBpZihzW2pdPT0nYicpIGIrKzsKLy8gICAgICAgICBpZihzW2pdPT0nYycpIGMrKzsKLy8gICAgICAgICBqKys7Ci8vICAgICAgIH0KLy8gICAgICAgaWYoYT09MCB8fCBiPT0wIHx8IGM9PTApIGJyZWFrOwovLyAgICAgICByZXMgKz0gTiAtIGogKyAxOwovLyAgICAgICBpZihzW2ldPT0nYScpIGEtLTsKLy8gICAgICAgaWYoc1tpXT09J2InKSBiLS07Ci8vICAgICAgIGlmKHNbaV09PSdjJykgYy0tOwovLyAgICAgfQovLyAKLy8gICAgIHJldHVybiByZXM7Ci8vICAgfQovLyB9Owo=