#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
typedef unsigned short int us;
typedef long long int lli;
typedef char c;
bool sprawdz(string n);
#define REP(x, y, z) for(us z = x; z < y; z++)
#define REPE(x, y, z) for(us z = x; z <= y; z++)
char samogloski[7] = { 'a', 'o', 'e', 'i', 'u', 'y' };
int main()
{
ios_base::sync_with_stdio(0);
string napis, bufor;
cin >> napis;
if (napis.length() <= 2)
cout << 0;
else
{
bool* trojka = new bool[napis.length()];
us* odleglosc = new us[napis.length()];
REP(0, napis.length(), i)
{
trojka[i] = false;
odleglosc[i] = 0;
}
REP(0, napis.length() - 2, i)
{
bufor = "";
bufor += napis[i];
bufor += napis[i + 1];
bufor += napis[i + 2];
if (sprawdz(bufor))
trojka[i] = true;
}
us dlugosc = 0;
bool first_lap = true;
REP(0, napis.length() - 2, i)
{
if (trojka[i] && first_lap)
{
odleglosc[i] = 0;
dlugosc = 1;
first_lap = false;
}
else if (trojka[i])
{
odleglosc[i] = dlugosc;
dlugosc = 1;
}
else
++dlugosc;
}
lli wynik = 0;
first_lap = true;
REP(0, napis.length() - 2, i)
{
if (trojka[i] && first_lap)
{
wynik += ((i + 1) * (napis.length() - (i + 2) - 1 + 1));
first_lap = false;
}
else if (trojka[i])
wynik += (odleglosc[i] * (napis.length() - (i + 2) - 1 + 1));
}
cout << wynik;
}
}
bool sprawdz(string n)
{
bool pierwsza = false, druga = false, trzecia = false;
//true - samogloska false = spolgloska
REP(0, 7, i)
if (n[0] == samogloski[i])
pierwsza = true;
REP(0, 7, i)
if (n[1] == samogloski[i])
druga = true;
if (pierwsza != druga)
return 0;
REP(0, 7, i)
if (n[2] == samogloski[i])
trzecia = true;
if (druga != trzecia)
return 0;
else
return 1;
}
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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | #include <iostream> #include <cstdio> #include <string> using namespace std; typedef unsigned short int us; typedef long long int lli; typedef char c; bool sprawdz(string n); #define REP(x, y, z) for(us z = x; z < y; z++) #define REPE(x, y, z) for(us z = x; z <= y; z++) char samogloski[7] = { 'a', 'o', 'e', 'i', 'u', 'y' }; int main() { ios_base::sync_with_stdio(0); string napis, bufor; cin >> napis; if (napis.length() <= 2) cout << 0; else { bool* trojka = new bool[napis.length()]; us* odleglosc = new us[napis.length()]; REP(0, napis.length(), i) { trojka[i] = false; odleglosc[i] = 0; } REP(0, napis.length() - 2, i) { bufor = ""; bufor += napis[i]; bufor += napis[i + 1]; bufor += napis[i + 2]; if (sprawdz(bufor)) trojka[i] = true; } us dlugosc = 0; bool first_lap = true; REP(0, napis.length() - 2, i) { if (trojka[i] && first_lap) { odleglosc[i] = 0; dlugosc = 1; first_lap = false; } else if (trojka[i]) { odleglosc[i] = dlugosc; dlugosc = 1; } else ++dlugosc; } lli wynik = 0; first_lap = true; REP(0, napis.length() - 2, i) { if (trojka[i] && first_lap) { wynik += ((i + 1) * (napis.length() - (i + 2) - 1 + 1)); first_lap = false; } else if (trojka[i]) wynik += (odleglosc[i] * (napis.length() - (i + 2) - 1 + 1)); } cout << wynik; } } bool sprawdz(string n) { bool pierwsza = false, druga = false, trzecia = false; //true - samogloska false = spolgloska REP(0, 7, i) if (n[0] == samogloski[i]) pierwsza = true; REP(0, 7, i) if (n[1] == samogloski[i]) druga = true; if (pierwsza != druga) return 0; REP(0, 7, i) if (n[2] == samogloski[i]) trzecia = true; if (druga != trzecia) return 0; else return 1; } |
English