diff options
Diffstat (limited to 'cpptour/weirdo.cc')
-rw-r--r-- | cpptour/weirdo.cc | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/cpptour/weirdo.cc b/cpptour/weirdo.cc new file mode 100644 index 0000000..f79336c --- /dev/null +++ b/cpptour/weirdo.cc @@ -0,0 +1,83 @@ +#include <iostream> +#include <set> +#include <stdexcept> +#include <string> +#include <unordered_map> + +using namespace std; + +typedef unordered_map<char, size_t> charmap; +typedef set<char> charset; + +constexpr double INF = 1e7; +const charset VOWELS {'a', 'e', 'i', 'o', 'u'}; + +inline size_t +sqr (size_t i) +{ + return i * i; +} + +bool +isvowel (const string& s, size_t i) +{ + try { return VOWELS.count (s.at (i)); } + catch (out_of_range const& e) { return true; } +} + +void +update (const string& s, charmap& x, charmap& f) +{ + charset b; + for (const auto& c : s) + { + f[c]++; + b.insert (c); + } + for (const auto& c : b) + x[c]++; +} + +int +main () +{ + size_t t, l; + string s; + + cin >> t; + while (t--) + { + charmap xa, fa, xb, fb; + cin >> l; + while (l--) + { + cin >> s; + size_t i = s.size (); + bool a = true; + + while (i--) + if (isvowel (s, i - 1) + isvowel (s, i) + isvowel (s, i + 1) < 2) + { + update (s, xb, fb); + a = false; + break; + } + if (a) + update (s, xa, fa); + } + + double sc = 1.0; + for (const auto& p : xa) + sc *= p.second; + for (const auto& p : fa) + sc /= sqr (p.second); + for (const auto& p : xb) + sc /= p.second; + for (const auto& p : fb) + sc *= sqr (p.second); + if (sc > INF) + cout << "Infinity" << endl; + else + cout << sc << endl; + } +} |