Vasya has recently learned to type and log on to the Internet. He immediately entered a chat room and decided to say hello to everybody. Vasya typed the word *s*. It is considered that Vasya managed to say hello if several letters can be deleted from the typed word so that it resulted in the word "hello". For example, if Vasya types the word "ahhellllloou", it will be considered that he said hello, and if he types "hlelo", it will be considered that Vasya got misunderstood and he didn't manage to say hello. Determine whether Vasya managed to say hello by the given word *s*.
The first and only line contains the word *s*, which Vasya typed. This word consisits of small Latin letters, its length is no less that 1 and no more than 100 letters.
# cook your dish here
#!/usr/bin/env python
import os
from math import ceil
import sys
from io import BytesIO, IOBase
import sys,bisect,copyreg,copy,statistics,os
import random


def inp(): return sys.stdin.readline().strip()
def IIX(): return (int(x) for x in sys.stdin.readline().split())
def II(): return (int(inp()))
def LI(): return list(map(int, inp().split()))
def LS(): return list(map(str, inp().split()))
def L(x):return list(x)
def out(var): return sys.stdout.write(str(var))

#Graph using Ajdacency List


class GraphAL:
    def __init__(self,Nodes,isDirected=False):
        self.nodes=[x for x in range(1,Nodes+1) ]
        self.adj_list={}
        self.isDirected=isDirected
        for node in self.nodes:
            self.adj_list[node]=[]

    def add_edge(self,x,y):
        self.adj_list[x].append(y)
        if self.isDirected==False:
            self.adj_list[y].append(x)

    def return_graph(self):
        return(self.adj_list)

#Graph using Ajdacency Matrix

class GraphAM:
    def __init__(self,Nodes,isDirected=False):
        self.adj_matrix=[ [0]*(Nodes+1) for x in range(Nodes+2)]
        self.isDirected=isDirected

    def add_edge(self,x,y):
        if self.isDirected:
            self.adj_matrix[x][y]=1
        elif self.isDirected==False:
            self.adj_matrix[x][y]=1
            self.adj_matrix[y][x]=1

    def delete_edge(self,x,y):
        if self.isDirected:
            self.adj_matrix[x][y]=0
        if self.isDirected==False:
            self.adj_matrix[x][y]=0
            self.adj_matrix[y][x]=0

    def degree(self,x):
        l=self.adj_matrix[x]
        return l.count(1)

    def return_graph(self):
        return self.adj_matrix



'''
nodes=II()
edges=II()
graph=GraphAL(nodes) #Add 'True' to the Graph method, for directed graph
connections=[]
for i in range(edges):
    l=LI()
    connections.append(l)

for connect in connections:
    graph.add_edge(connect[0],connect[1])

grp=graph.return_graph()
'''

#Code goes here{{{}}}
def gcd(a,b):
	if b==0:
		return a
	else:
		return gcd(b,a % b)


def solve():
        #Start coding
        s=inp()
        hashMap={}
        for x in s:
            if x not in hashMap:
                hashMap[x]=1
            else:
                hashMap[x]+=hashMap[x]
        s="helo"
        avs=""
        for x in hashMap:
            avs+=x
        if s in avs:
            out('YES\n')
        else:
            out('NO\n')
        
        return
def recur(n,i):
    return 


# region fastio
BUFSIZE = 8192

class FastIO(IOBase):
    newlines = 0
    

    def __init__(self, file):
        self._fd = file.fileno()
        self.buffer = BytesIO()
        self.writable = "x" in file.mode or "r" not in file.mode
        self.write = self.buffer.write if self.writable else None

    def read(self):
        while True:
            b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
            if not b:
                break
            ptr = self.buffer.tell()
            self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr)
        self.newlines = 0
        return self.buffer.read()

    def readline(self):
        while self.newlines == 0:
            b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
            self.newlines = b.count(b"\n") + (not b)
            ptr = self.buffer.tell()
            self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr)
        self.newlines -= 1
        return self.buffer.readline()

    def flush(self):
        if self.writable:
            os.write(self._fd, self.buffer.getvalue())
            self.buffer.truncate(0), self.buffer.seek(0)


class IOWrapper(IOBase):
    def __init__(self, file):
        self.write = lambda s: self.buffer.write(s.encode("ascii"))
        self.read = lambda: self.buffer.read().decode("ascii")
        self.buffer = FastIO(file)
        self.flush = self.buffer.flush
        self.writable = self.buffer.writable
        self.readline = lambda: self.buffer.readline().decode("ascii")


sys.stdin, sys.stdout = IOWrapper(sys.stdin), IOWrapper(sys.stdout)
input = lambda: sys.stdin.readline().rstrip("\r\n")

# endregion

if __name__ == "__main__":
    try:
        t=1
        for _ in range(t):
            solve()
    except EOFError as e:
        out('')
    except RuntimeError as r:
        out('')
