#include <iostream> #include <string> #include <vector> #include <cmath> using namespace std; inline bool isVowel(std::string::value_type const a) { return (a == 'a' || a == 'e' || a == 'i' || a == 'o' || a == 'u' || a == 'y'); } bool equalType(std::string::value_type const a, std::string::value_type const b) { if (isVowel(a) && isVowel(b)) return true; if (!isVowel(a) && !isVowel(b)) return true; return false; } int main() { string s; cin >> s; const auto maxsize = s.length(); vector<unsigned short> num(maxsize, 0); num[0] = 1; for (auto i = 1u; i < maxsize; i++) { if (equalType(s[i], s[i-1])) num[i] = num[i-1] + 1; else num[i] = 1; } //for (auto x : s) //cout << x << " "; //cout <<endl; //for (auto x : num) //cout << x << " "; //cout <<endl; unsigned long long sum = 0; unsigned long long prevNoProblem = 2; //unsigned long long prevProblem = 0; for (auto i = 2u; i < maxsize; i++) { if (num[i] == 3) prevNoProblem-=2; if (num[i] == 1 && num[i-1] > 2) { prevNoProblem = 2; } if (num[i] < 3) prevNoProblem++; auto const numAfterPos = maxsize - i - 1; if (num[i] == 3) { auto x = max((prevNoProblem == 0 ? 0 : prevNoProblem + 1), 1ULL) * (numAfterPos + 1); sum += x; //cout << "NumAfterPos = "<<numAfterPos << " prevNoProblem="<<prevNoProblem<< " prevProblem="<<prevProblem<<" sum +="<<x<<endl; } if (num[i] > 3) { auto x = numAfterPos + 1; sum += x; //cout << "numAfterPos = "<<numAfterPos << " prevNoProblem="<<prevNoProblem<< " prevProblem="<<prevProblem<<" sum +="<<x<<endl; } //cout << "i="<<i<< " prevNoProblem="<<prevNoProblem<<endl; } cout << sum << endl; 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 | #include <iostream> #include <string> #include <vector> #include <cmath> using namespace std; inline bool isVowel(std::string::value_type const a) { return (a == 'a' || a == 'e' || a == 'i' || a == 'o' || a == 'u' || a == 'y'); } bool equalType(std::string::value_type const a, std::string::value_type const b) { if (isVowel(a) && isVowel(b)) return true; if (!isVowel(a) && !isVowel(b)) return true; return false; } int main() { string s; cin >> s; const auto maxsize = s.length(); vector<unsigned short> num(maxsize, 0); num[0] = 1; for (auto i = 1u; i < maxsize; i++) { if (equalType(s[i], s[i-1])) num[i] = num[i-1] + 1; else num[i] = 1; } //for (auto x : s) //cout << x << " "; //cout <<endl; //for (auto x : num) //cout << x << " "; //cout <<endl; unsigned long long sum = 0; unsigned long long prevNoProblem = 2; //unsigned long long prevProblem = 0; for (auto i = 2u; i < maxsize; i++) { if (num[i] == 3) prevNoProblem-=2; if (num[i] == 1 && num[i-1] > 2) { prevNoProblem = 2; } if (num[i] < 3) prevNoProblem++; auto const numAfterPos = maxsize - i - 1; if (num[i] == 3) { auto x = max((prevNoProblem == 0 ? 0 : prevNoProblem + 1), 1ULL) * (numAfterPos + 1); sum += x; //cout << "NumAfterPos = "<<numAfterPos << " prevNoProblem="<<prevNoProblem<< " prevProblem="<<prevProblem<<" sum +="<<x<<endl; } if (num[i] > 3) { auto x = numAfterPos + 1; sum += x; //cout << "numAfterPos = "<<numAfterPos << " prevNoProblem="<<prevNoProblem<< " prevProblem="<<prevProblem<<" sum +="<<x<<endl; } //cout << "i="<<i<< " prevNoProblem="<<prevNoProblem<<endl; } cout << sum << endl; return 0; } |