unittest
{
	assert( [ "RRLRL" ].parse.expand.solve == "0 1 2 1 1" );
	assert( [ "RRLLLLRLRRLL" ].parse.expand.solve == "0 3 3 0 0 0 1 1 0 2 2 0" );
	assert( [ "RRRLLRLLRRRLLLLL" ].parse.expand.solve == "0 0 3 2 0 2 1 0 0 0 4 4 0 0 0 0" );
}



import std.conv;
import std.math;
import std.range;
import std.stdio;
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.to!( dchar[] );
	return tuple( s );
}

auto solve( dchar[] s )
{
	auto anss = new long[ s.length ];
	anss[] = 1;
	
	// RRをまとめる
	for( auto i = 0L; i + 1 < s.length; i++ )
	{
		if( s[ i ] == 'R' && s[ i + 1 ] == 'R' )
		{
			anss[ i + 1 ] += anss[ i ];
			anss[ i ] = 0L;
		}
	}
	
	// LLをまとめる
	for( auto i = s.length.signed - 1; 0 < i; i-- )
	{
		if( s[ i ] == 'L' && s[ i - 1 ] == 'L' )
		{
			anss[ i - 1 ] += anss[ i ];
			anss[ i ] = 0L;
		}
	}
	
	// RLを計算
	for( auto i = 0L; i + 1 < s.length; i++ )
	{
		if( s[ i ] == 'R' && s[ i + 1 ] == 'L' )
		{
			auto l = cast( long )( ceil(  anss[ i ] / 2.0 ) + floor( anss[ i + 1 ] / 2.0 ) );
			auto r = cast( long )( floor( anss[ i ] / 2.0 ) + ceil(  anss[ i + 1 ] / 2.0 ) );
			anss[ i     ] = l;
			anss[ i + 1 ] = r;
		}
	}
	
	return anss.to!( string[] ).join( " " );
}
