#include <iostream>
#include <map>
#include <fstream>
#include <string.h>
#include <map>
#include <algorithm>
using namespace std;
char slowo[300001];
int dl;
long long liczba_par(const map<long long, long long>& wyst){
long long wynik=0;
for(auto it = wyst.begin(); it!=wyst.end(); it++)
wynik+=((it->second))*((it->second)-1);
return wynik/2;
}
/*
map<pair<int, int>, long long> abc; ///(a-c, b-c)
map<pair<int, int>, long long> ab; ///(a-b, c)
map<pair<int, int>, long long> ac; ///(a-c, b)
map<pair<int, int>, long long> bc; ///(b-c, a)
map<pair<int, int>, long long> a; ///(b, c)
map<pair<int, int>, long long> b; ///(a, c)
map<pair<int, int>, long long> c; ///(a, b)
void dodaj(int licza, int liczb, int liczc){
abc[make_pair(licza-liczc, liczb-liczc)]++;
ab[make_pair(licza-liczb, liczc)]++;
ac[make_pair(licza-liczc, liczb)]++;
bc[make_pair(liczb-liczc, licza)]++;
a[make_pair(liczb, liczc)]++;
b[make_pair(licza, liczc)]++;
c[make_pair(licza, liczb)]++;
}
*/
map<long long, long long> abc; ///(a-c, b-c)
map<long long, long long> ab; ///(a-b, c)
map<long long, long long> ac; ///(a-c, b)
map<long long, long long> bc; ///(b-c, a)
map<long long, long long> a; ///(b, c)
map<long long, long long> b; ///(a, c)
map<long long, long long> c; ///(a, b)
#define zrob_pare(x, y) (((x)<<32) + (y))
void dodaj(long long licza, long long liczb, long long liczc){
abc[zrob_pare(licza-liczc, liczb-liczc)]++;
ab[zrob_pare(licza-liczb, liczc)]++;
ac[zrob_pare(licza-liczc, liczb)]++;
bc[zrob_pare(liczb-liczc, licza)]++;
a[zrob_pare(liczb, liczc)]++;
b[zrob_pare(licza, liczc)]++;
c[zrob_pare(licza, liczb)]++;
}
int main()
{
long long licza=600000;
long long liczb=300000;
long long liczc=0;
scanf("%s", slowo);
dl = strlen(slowo);
//dl=300000;
//for(int i=0; i<dl; i++){
// slowo[i]=('a'+(i%3));
//}
dodaj(licza, liczb, liczc);
for(int i=0; i<dl; i++)
{
if(slowo[i]=='a') licza++; else
if(slowo[i]=='b') liczb++; else
if(slowo[i]=='c') liczc++;
dodaj(licza, liczb, liczc);
}
//cout << "XD" << endl;
long long wynik=0;
wynik+=liczba_par(abc);
wynik+=liczba_par(ab);
wynik+=liczba_par(ac);
wynik+=liczba_par(bc);
wynik+=liczba_par(a);
wynik+=liczba_par(b);
wynik+=liczba_par(c);
cout << wynik;
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | #include <iostream> #include <map> #include <fstream> #include <string.h> #include <map> #include <algorithm> using namespace std; char slowo[300001]; int dl; long long liczba_par(const map<long long, long long>& wyst){ long long wynik=0; for(auto it = wyst.begin(); it!=wyst.end(); it++) wynik+=((it->second))*((it->second)-1); return wynik/2; } /* map<pair<int, int>, long long> abc; ///(a-c, b-c) map<pair<int, int>, long long> ab; ///(a-b, c) map<pair<int, int>, long long> ac; ///(a-c, b) map<pair<int, int>, long long> bc; ///(b-c, a) map<pair<int, int>, long long> a; ///(b, c) map<pair<int, int>, long long> b; ///(a, c) map<pair<int, int>, long long> c; ///(a, b) void dodaj(int licza, int liczb, int liczc){ abc[make_pair(licza-liczc, liczb-liczc)]++; ab[make_pair(licza-liczb, liczc)]++; ac[make_pair(licza-liczc, liczb)]++; bc[make_pair(liczb-liczc, licza)]++; a[make_pair(liczb, liczc)]++; b[make_pair(licza, liczc)]++; c[make_pair(licza, liczb)]++; } */ map<long long, long long> abc; ///(a-c, b-c) map<long long, long long> ab; ///(a-b, c) map<long long, long long> ac; ///(a-c, b) map<long long, long long> bc; ///(b-c, a) map<long long, long long> a; ///(b, c) map<long long, long long> b; ///(a, c) map<long long, long long> c; ///(a, b) #define zrob_pare(x, y) (((x)<<32) + (y)) void dodaj(long long licza, long long liczb, long long liczc){ abc[zrob_pare(licza-liczc, liczb-liczc)]++; ab[zrob_pare(licza-liczb, liczc)]++; ac[zrob_pare(licza-liczc, liczb)]++; bc[zrob_pare(liczb-liczc, licza)]++; a[zrob_pare(liczb, liczc)]++; b[zrob_pare(licza, liczc)]++; c[zrob_pare(licza, liczb)]++; } int main() { long long licza=600000; long long liczb=300000; long long liczc=0; scanf("%s", slowo); dl = strlen(slowo); //dl=300000; //for(int i=0; i<dl; i++){ // slowo[i]=('a'+(i%3)); //} dodaj(licza, liczb, liczc); for(int i=0; i<dl; i++) { if(slowo[i]=='a') licza++; else if(slowo[i]=='b') liczb++; else if(slowo[i]=='c') liczc++; dodaj(licza, liczb, liczc); } //cout << "XD" << endl; long long wynik=0; wynik+=liczba_par(abc); wynik+=liczba_par(ab); wynik+=liczba_par(ac); wynik+=liczba_par(bc); wynik+=liczba_par(a); wynik+=liczba_par(b); wynik+=liczba_par(c); cout << wynik; return 0; } |
English