about summary refs log tree commit diff
path: root/cpptour
diff options
context:
space:
mode:
authorNguyễn Gia Phong <vn.mcsinyx@gmail.com>2019-11-11 17:55:52 +0700
committerNguyễn Gia Phong <vn.mcsinyx@gmail.com>2019-11-11 17:55:52 +0700
commitb38d9929f7a015b56b847fde7e83f814f354497e (patch)
treedef6101df9623550d2d826831504ef93c54b0297 /cpptour
parentcacc165173d67fa110766a555afe3020967d220c (diff)
downloadcp-b38d9929f7a015b56b847fde7e83f814f354497e.tar.gz
One does not simply do CP well in NNN
Diffstat (limited to 'cpptour')
-rw-r--r--cpptour/Vector-test.cc9
-rw-r--r--cpptour/Vector.cc23
-rw-r--r--cpptour/Vector.h3
-rw-r--r--cpptour/weirdo.cc83
4 files changed, 113 insertions, 5 deletions
diff --git a/cpptour/Vector-test.cc b/cpptour/Vector-test.cc
index b49ff85..fbdf129 100644
--- a/cpptour/Vector-test.cc
+++ b/cpptour/Vector-test.cc
@@ -1,3 +1,4 @@
+#include <cassert>
 #include <iostream>
 #include <stdexcept>
 
@@ -13,8 +14,16 @@ neg_length ()
   catch (bad_alloc) { cout << "BIG OOF!" << endl; }
 }
 
+void
+init ()
+{
+  Vector v {7.4, 3.2, 5.2, 6.9, 9.5, 4.2, 21.7};
+  assert(v[5] == 4.2);
+}
+
 int
 main ()
 {
   neg_length ();
+  init ();
 }
diff --git a/cpptour/Vector.cc b/cpptour/Vector.cc
index aa09eef..8f94345 100644
--- a/cpptour/Vector.cc
+++ b/cpptour/Vector.cc
@@ -12,14 +12,27 @@ Vector::Vector (int s)
   sz = s;
 }
 
-double& Vector::operator[] (int i)
+Vector::Vector (initializer_list<double> lst)
+: elem {new double[lst.size()]}, sz {static_cast<int> (lst.size())}
 {
-  if (i < 0 || size() <= i)
-    throw out_of_range{"Vector::operator[]"};
-  return elem[i];
+  copy(lst.begin(), lst.end(), elem);
+}
+
+Vector::~Vector ()
+{
+  delete[] elem;
 }
 
-int Vector::size () noexcept
+int
+Vector::size () noexcept
 {
   return sz;
 }
+
+double&
+Vector::operator[] (int i)
+{
+  if (i < 0 || size() <= i)
+    throw out_of_range{"Vector::operator[]"};
+  return elem[i];
+}
diff --git a/cpptour/Vector.h b/cpptour/Vector.h
index c7bbc68..8508503 100644
--- a/cpptour/Vector.h
+++ b/cpptour/Vector.h
@@ -1,8 +1,11 @@
 class Vector {
 public:
   Vector (int s);
+  Vector (std::initializer_list<double>);
+  ~Vector ();
   double& operator[] (int i);
   int size () noexcept;
+  void push_back (double);
 private:
   double* elem;
   int sz;
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;
+    }
+}