#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

// Abbreviations
#define mp make_pair
#define mt make_tuple
#define fi first
#define se second
#define pb push_back
#define pf push_front
#define eb emplace_back
#define ft front()
#define bk back()
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define forn(i, n) for (int i = 0; i < (int)(n); ++i)
#define for1(i, n) for (int i = 1; i <= (int)(n); ++i)
#define ford(i, n) for (int i = (int)(n) - 1; i >= 0; --i)
#define fore(i, a, b) for (int i = (int)(a); i <= (int)(b); ++i)
#define forr(i, a, b) for (int i = (int)(b); i >= (int)(a); --i)
#define trav(a, x) for (auto &a: x)
#define sz(a) (int)((a).size())
#define bit(n, i) (((n) >> (i)) & 1)
#define bitcount(n) __builtin_popcountll(n)

using namespace std;
using namespace __gnu_pbds;

// Constants
const int ooi = 2e9;
const long long ool = 1e18 + 5;
const int mod = 1e9 + 7;
const double PI = acos(-1);
const long double eps = 1e-9;

// Abbreviations
typedef pair<int, int> pii;
typedef map<int, int> mii;
typedef vector<int> vi;
typedef vector<pii> vpi;
typedef vector<vi> vvi;
typedef set<int> si;
typedef queue<int> qi;
typedef priority_queue<int> pqi;
typedef long long i64;
typedef vector<i64> vi64;
typedef vector<vi64> vvi64;
typedef pair<i64, i64> pi64;
typedef double ld;
typedef long double lld;
typedef unsigned long long ui64;

// Min - max
template<class T> bool uin(T &a, T b) { return a > b ? (a = b, true) : false; }
template<class T> bool uax(T &a, T b) { return a < b ? (a = b, true) : false; }

// Fast IO
template<typename T> inline void read(T &x) {
  char c;
  bool neg = false;
  while ((!isdigit(c = getchar())) && c != '-');
  if (c == '-') {
    c = getchar(); neg = true;
  }
  x = c - 48;
  while (isdigit(c = getchar())) {
    x = x * 10 + (c - 48);
  }
  if (neg) x = -x;
}
template<typename T> inline void Write(T x) {
  if (x > 9) Write(x / 10);
  putchar(x % 10 + 48);
}
template<typename T> inline void write(T x) {
  if (x < 0) {
    putchar('-');
    x = -x;
  }
  Write(x);
}

// Debug
string to_string(string s) {
  return '"' + s + '"';
}

string to_string(const char* s) {
  return to_string((string) s);
}

string to_string(bool b) {
  return (b ? "true" : "false");
}

template <typename A, typename B>
string to_string(pair<A, B> p) {
  return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}

template <typename A>
string to_string(A v) {
  bool first = true;
  string res = "{";
  for (const auto &x : v) {
    if (!first) {
      res += ", ";
    }
    first = false;
    res += to_string(x);
  }
  res += "}";
  return res;
}

void debug_out() { cerr << endl; }

template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  cerr << " " << to_string(H);
  debug_out(T...);
}

#ifdef LOCAL_DEFINE
  #define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
  #define debug(...) 42
#endif

// Tree-order statistics
typedef tree<
int,
null_type,
less<int>,
rb_tree_tag,
tree_order_statistics_node_update>
ordered_set;

// Commonly used functions
inline i64 gcd(i64 a, i64 b) { // Use __gcd(a, b) instead for int
  i64 r;
  while (b) {
    r = a % b; a = b; b = r;
  }
  return a;
}

inline i64 lcm(i64 a, i64 b) {
  return (a / gcd(a, b) * b);
}

inline i64 fpow(i64 a, i64 b, i64 m = mod) {
  i64 r = 1;
  for (; b; b >>= 1) {
    if (b & 1) r = r * a % m;
    a = a * a % m;
  }
  return r;
}

inline void addmod(int &a, int val, int m = mod) {
  if ((a = a + val) >= m) a -= m;
}

inline void submod(int &a, int val, int m = mod) {
  if ((a = a + val) < 0) a += m;
}

inline int mult(int a, int b, int m = mod) {
  return (i64) a * b % m;
}

inline int inv(int a, int m = mod) {
  return fpow(a, m - 2, m);
}

#ifdef LOCAL_DEFINE
  mt19937 rnd(42); // Seed 42, output 1608637542
#else
  mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
#endif
inline int mrand() {
  return abs((int) rnd());
}

// Main program starts here

int main(void) {
  ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  cout.precision(10); cout << fixed;
#ifdef LOCAL_DEFINE
  freopen("input.txt", "r", stdin);
#endif

  string s;
  cin >> s;
  int n = sz(s);
  if (n & 1) {
    cout << "No\n";
    return 0;
  }
  for (int i = 0; i < n; i += 2) {
    if (s[i] != 'h' || s[i + 1] != 'i') {
      cout << "No\n";
      return 0;
    }
  }
  cout << "Yes\n";

#ifdef LOCAL_DEFINE
  cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endif
  return 0;
}


Measured memory_bytes: 256