#include <cstdio> #include <vector> #include <iostream> using namespace std; bool czy_samogloska(char c) { if (c == 'a' || c == 'e' || c == 'i' || c == 'y' || c == 'u' || c == 'o') { return true; } return false; } int main() { char c; vector<int> v; string s; getline(cin, s); long long int n = s.length(); // Want to start counting from 1 v.push_back(0); for (int i = 0; i < n; ++i) { if (czy_samogloska(s[i])) { v.push_back(0); } else { v.push_back(1); } } // Zapelnienie ostatniego pola aby ulatwic obliczenia if (v[n] == 1) { v.push_back(0); } else { v.push_back(1); } long long int last = 2; long long int j = 1; if (n <= 2) { printf("0"); v.clear(); return 0; } // Wiemy ze n >= 3 long long int suma = (n*(n+1)/2); for (long long int i = 1; i <=n; i++) { if (v[i+1] != v[j]) { if (i-j+1 >=3) { // mamy blok zaczynajacy sie w pozycji j ktory konczy sie w pozycji i long long int dl = (j+1) - (last - 1) + 1; // dlugosc rozszerzonego bloku long long int x = (dl*(dl + 1)) / 2; // ilosc dobrych ciagow w rozszerzonym bloku suma -= x; dl = i-j+1; // Odejmij liczbe dobrych dwojek wewnatrz bloku suma -= (dl-3); // Odejmij liczbe dobrych jedynek wewnatrz bloku suma -= (dl-4); last = i; } j = i+1; } } // Trzeba doliczyc koncowke int y = n - (last-1) + 1; suma -= (long long int)((y*(y+1) / 2)); printf ("%lld", suma); 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 91 92 93 94 95 | #include <cstdio> #include <vector> #include <iostream> using namespace std; bool czy_samogloska(char c) { if (c == 'a' || c == 'e' || c == 'i' || c == 'y' || c == 'u' || c == 'o') { return true; } return false; } int main() { char c; vector<int> v; string s; getline(cin, s); long long int n = s.length(); // Want to start counting from 1 v.push_back(0); for (int i = 0; i < n; ++i) { if (czy_samogloska(s[i])) { v.push_back(0); } else { v.push_back(1); } } // Zapelnienie ostatniego pola aby ulatwic obliczenia if (v[n] == 1) { v.push_back(0); } else { v.push_back(1); } long long int last = 2; long long int j = 1; if (n <= 2) { printf("0"); v.clear(); return 0; } // Wiemy ze n >= 3 long long int suma = (n*(n+1)/2); for (long long int i = 1; i <=n; i++) { if (v[i+1] != v[j]) { if (i-j+1 >=3) { // mamy blok zaczynajacy sie w pozycji j ktory konczy sie w pozycji i long long int dl = (j+1) - (last - 1) + 1; // dlugosc rozszerzonego bloku long long int x = (dl*(dl + 1)) / 2; // ilosc dobrych ciagow w rozszerzonym bloku suma -= x; dl = i-j+1; // Odejmij liczbe dobrych dwojek wewnatrz bloku suma -= (dl-3); // Odejmij liczbe dobrych jedynek wewnatrz bloku suma -= (dl-4); last = i; } j = i+1; } } // Trzeba doliczyc koncowke int y = n - (last-1) + 1; suma -= (long long int)((y*(y+1) / 2)); printf ("%lld", suma); return 0; } |