#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; } |