/*
题目还是满水的 不过TML了一次 WA了一次
写个blog 纪念一下 涨点教训
*/
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
__int64 n,ans;
int h[1000005],m[1000005],cnt1,cnt2,cnth,cntm;
char s[1000005];
void solve()
{
int i,j,len;
cnt1=cnt2=0;
len=strlen(s);
for(i=0;i<=len-5;i++) // 找出哪些位置出现了“heavy"和"metal" 并将首位置记录在各自数组中
{
if(s[i]=='h')
{
if(s[i+1]=='e'&&s[i+2]=='a'&&s[i+3]=='v'&&s[i+4]=='y')
{
h[++cnt1]=i;
}
}
if(s[i]=='m')
{
if(s[i+1]=='e'&&s[i+2]=='t'&&s[i+3]=='a'&&s[i+4]=='l')
{
m[++cnt2]=i;
}
}
}
h[cnt1+1]=100000000; // 类似贪心 要在最后加一个哨兵
m[cnt2+1]=100000005;
ans=0;
cnth=cntm=1;
while(cnth<=cnt1||cntm<=cnt2) // 开始用的二阶循环 导致TMl 其实一阶完全可以搞定
{
if(h[cnth]<m[cntm]) // 若不加哨兵 则cnth=cnt1后会一直执行语句一
{
cnth++;
}
else // 同理m[]也要加哨兵 开始m[]没加WA了一次
{
ans+=cnth-1;
cntm++;
}
}
}
int main()
{
int i,j,t;
while(gets(s)!=NULL)
{
solve();
printf("%I64d\n",ans);
}
return 0;
}