unittest
{
	assert( [ "keyofscience" ].parse.expand.solve == "YES" );
	assert( [ "mpyszsbznf" ].parse.expand.solve == "NO" );
	assert( [ "ashlfyha" ].parse.expand.solve == "NO" );
	assert( [ "keyence" ].parse.expand.solve == "YES" );

	assert( [ "keyencex" ].parse.expand.solve == "YES" );				// 追加ケース
	assert( [ "xkeyencex" ].parse.expand.solve == "NO" );				// 追加ケース
	assert( [ "keyxxxenxxxence" ].parse.expand.solve == "YES" );		// 追加ケース
}



import std.conv;
import std.range;
import std.stdio;
import std.string;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto s = input.front;
	return tuple( s );
}

auto solve( string s )
{
	return match( s, "keyence", 0, false ) ? "YES" : "NO";
}

bool match( string s, string k, long dc, bool ma )
{
	// 削除対象の部分文字列が2個以上になったら失敗
	if( 1 < dc ) return false;
	
	// マッチングが完了
	if( s.length <= 0 && k.length <= 0 ) return true;
	
	// マッチングの途中で入力文字列が足りなくなったら失敗
	if( s.length < k.length ) return false;
	
	// マッチングの途中で入力文字列が余ったら、余った分は削除対象扱い
	if( k.length <= 0 ) return ( dc <= 0 );
	
	// 先頭の文字をマッチング
	if( s[ 0 ] == k[ 0 ] )
	{
		auto m1 = match( s[ 1 .. $ ], k[ 1 .. $ ], dc,       false );		// マッチしたパターン
		auto m2 = match( s[ 1 .. $ ], k[ 0 .. $ ], dc + !ma, true );		// マッチを無視するパターン
		return ( m1 || m2 );
	}
	else
	{
		auto m2 = match( s[ 1 .. $ ], k[ 0 .. $ ], dc + !ma, true );		// マッチしなかったパターン
		return m2;
	}
}
