#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <iostream>
#include <queue>
#define lson rt<<1
#define rson rt<<1|1
using namespace std;
typedef long long ll;
typedef pair<int, int>  P;
typedef pair<int, P>  PP;
char s[100];
int main()
{
    cin>>s;
    int len=strlen(s),flag=0;
    for(int i=0;i<len;i++)
    {
        if(i%2==0)
            if(s[i]!='h')
                flag=1;
        if(i%2==1)
        if(s[i]!='i')
            flag=1;
            
    }
    if(flag==1||len%2==1)
        cout<<"No";
    else
        cout<<"Yes";
}
//const int maxn=1e3+10;
//struct Point
//{
//    int x,y;
//    Point(){}
//    Point(int _x,int _y)
//    {
//        x = _x;y = _y;
//    }
//    Point operator -(const Point &b)const
//    {
//        return Point(x - b.x,y - b.y);
//    }
//    int operator ^(const Point &b)const
//    {
//        return x*b.y - y*b.x;
//    }
//    int operator *(const Point &b)const
//    {
//        return x*b.x + y*b.y;
//    }
//};
//Point point[100],jizhan[maxn];
//int w[maxn];
//P ans[maxn];
//int dp[100];
//int main()
//{
//    int n,m;
//    while(scanf("%d", &n))
//    {
//        if(n==0)
//            break;
//        for(int i=0;i<n;i++)
//        {
//            scanf("%d%d",&point[i].x,&point[i].y);
//        }
//        scanf("%d",&m);
//        for(int i=0;i<m;i++)
//            scanf("%d%d%d",&jizhan[i].x,&jizhan[i].y,&w[i]);
//        int s,e;
//        for(int i=0;i<m;i++)
//        {
//            for(int j=0;j<n;j++)
//            {
//                int pre=(j-1+n)%n,nex=(j+1)%n;
//                int flag1,flag2;
//                if(((point[j]-jizhan[i])^(point[nex]-jizhan[i]))<0)
//                    flag1=1;
//                else
//                    flag1=0;
//
//                if(((point[pre]-jizhan[i])^(point[j]-jizhan[i]))<0)
//                    flag2=1;
//                else
//                    flag2=0;
//
//                if(flag1==1&&flag2==0)
//                {
//                    s=j;
//                }
//                if(flag1==0&&flag2==1)
//                {
//                    e=j;
//                }
//            }
////            cout<<s<<" "<<e<<endl;
//            ans[i]=make_pair(s, e);
//        }
//        vector<PP> qujian;
//        for(int i=0;i<m;i++)
//        {
//            if(ans[i].first<ans[i].second)
//            {
//                qujian.push_back(make_pair(ans[i].first+1, make_pair(ans[i].second+1,w[i])));
//                qujian.push_back(make_pair(ans[i].first+1+n, make_pair(ans[i].second+1+n,w[i])));
//            }
//            else
//            {
//                qujian.push_back(make_pair(ans[i].first+1, make_pair(ans[i].second+1+n,w[i])));
//            }
//        }
//        sort(qujian.begin(), qujian.end());
//        int ans=1e9;
//        for(int i=1;i<=n;i++)
//        {
//            for(int j=0;j<=2*n;j++)
//                dp[j]=1e9;
//            dp[i-1]=0;
//            for(int j=0;j<qujian.size();j++)
//            {
//                int l=qujian[j].first,r=qujian[j].second.first,w=qujian[j].second.second;
////                cout<<l<<" "<<r<<" "<<w<<endl;
//                for(int k=l;k<=r;k++)
//                {
//                    dp[r]=min(dp[r],dp[k]+w);
//                }
//            }
//            for(int j=i+n-1;j<=2*n;j++)
//                ans=min(ans,dp[j]);
//        }
//
//        if(ans!=1e9)
//            printf("%d\n",ans);
//
//        else
//            printf("Impossible.\n");
//
//    }
//}
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//


Measured memory_bytes: 256