#include "iostream"
#include <string>
using namespace std;

//4

void change(const int *p1, int *p2, const string &str)
{
	if (str[1] == 'L')
	{
		p2[0] = p1[1];
	}
	else
	{
		p2[0] = 0;
	}
	for (int i = 1; i < str.size()-1; i++)
	{
			p2[i] = 0;
			if (str[i - 1] == 'R')
			{
				p2[i] += p1[i - 1];
			}
			if (str[i + 1] == 'L')
			{
				p2[i] += p1[i + 1];
			}
	}
	if (str[str.size() - 2] == 'R')
	{
		p2[str.size() - 1] = p1[str.size() - 2];
	}
	else
	{
		p2[str.size() - 1] = 0;
	}
}

void Change1(int *p1, int *p2, int count1, int count2)
{
	int count;
	int temp;
	if (count1 >= count2)
	{
		count = count1;
	}
	else
	{
		count = count2;
	}
	if(count%2==0)
	{
		temp = *p1;
		*p1 = *p2;
		*p2 = temp;
	}
}

void Trans(const int *p1, int *p2, const string &str)
{
	int iCountR;//表示R的个数
	int iCountL;//表示R的个数
	static const basic_string <char>::size_type npos = -1;
	int posR = 0;//指示当前寻找的R位置
	int posL = 0;//指示当前寻找的R位置
	//第一个肯定是R，所以从R开始寻找
	do
	{
		posL = str.find_first_not_of('R', posR);// find L
		//if (posL==npos)
		iCountR = posL - posR;
		if (posL==str.size()-1)
		{
			iCountL = str.size() - posL;
			if ((iCountL + iCountR) % 2 == 0)
			{
				p2[posL] = (iCountL + iCountR) / 2;
				p2[posL - 1] = (iCountL + iCountR) / 2;
			}
			else if (iCountL > iCountR)
			{
				p2[posL] = (iCountL + iCountR) / 2 + 1;
				p2[posL - 1] = (iCountL + iCountR) / 2;
				Change1(&p2[posL], &p2[posL - 1], iCountL, iCountR);
			}
			else
			{
				p2[posL - 1] = (iCountL + iCountR) / 2 + 1;
				p2[posL] = (iCountL + iCountR) / 2;
				Change1(&p2[posL], &p2[posL - 1], iCountL, iCountR);
			}
			break;
		}
		posR = str.find_first_not_of('L', posL);// find L
		if (posR == npos)//not find R,from the pos to end are L
		{
			iCountL = str.size() - posL;
			if ((iCountL + iCountR) % 2 == 0)
			{
				p2[posL] = (iCountL + iCountR) / 2;
				p2[posL - 1] = (iCountL + iCountR) / 2;
			}
			else if (iCountL > iCountR)
			{
				p2[posL] = (iCountL + iCountR) / 2 + 1;
				p2[posL - 1] = (iCountL + iCountR) / 2;
				Change1(&p2[posL], &p2[posL - 1], iCountL, iCountR);
			}
			else
			{
				p2[posL - 1] = (iCountL + iCountR) / 2 + 1;
				p2[posL] = (iCountL + iCountR) / 2;
				Change1(&p2[posL], &p2[posL - 1], iCountL, iCountR);
			}
			break;
		}
		else//find R
		{
			iCountL = posR - posL;
			if ((iCountL + iCountR) % 2 == 0)
			{
				p2[posL] = (iCountL + iCountR) / 2;
				p2[posL - 1] = (iCountL + iCountR) / 2;
			}
			else if(iCountL > iCountR)
			{
				p2[posL] = (iCountL + iCountR) / 2 + 1;
				p2[posL - 1] = (iCountL + iCountR) / 2;
				Change1(&p2[posL], &p2[posL - 1], iCountL, iCountR);
			}
			else
			{
				p2[posL-1] = (iCountL + iCountR) / 2 + 1;
				p2[posL] = (iCountL + iCountR) / 2;
				Change1(&p2[posL], &p2[posL - 1], iCountL, iCountR);
			}
		}
	} while (posR != npos);

}

int main(void)
{
	int i,j;
	string S;
	char s;
	int con = 1;
	int max = 1;

	//Input the string
	cin >> S;

	int *pNumber1 = new int[S.size()];
	int *pNumber2 = new int[S.size()];

	//寻找最大的连续R和L

	s = S[0];
	pNumber1[0] = 1;
	pNumber2[0] = 0;
	for (i = 1; i < S.size(); i++)
	{
		pNumber1[i] = 1;
		pNumber2[i] = 0;
		if (s == S[i])
		{
			con++;
			if (con > max)
			{
				max = con;
			}
		}
		else
		{
			s = S[i];
			con = 1;
		}
	}
	Trans(pNumber1, pNumber2, S);
	//开始交换max次
	//for (i = 1; i < max; i++)
	//{
	//	if (i % 2 != 0)
	//	{
	//		change(pNumber1, pNumber2, S);
	//	}
	//	else
	//	{
	//		change(pNumber2, pNumber1, S);
	//	}
	//}

/*	if ((max % 2) == 0)
	{
		change(pNumber2, pNumber1, S);
		for (j = 0; j < S.size(); j++)
		{

			cout << pNumber1[j] << ' ';
		}
	}
	else
	{
		for (j = 0; j < S.size(); j++)
		{
			cout << pNumber1[j] << ' ';
		}
	}
*/
	//if ((max % 2) != 0)
	//{
	//	change(pNumber2, pNumber1, S);
	//	for (j = 0; j < S.size(); j++)
	//	{

	//		cout << pNumber1[j] << ' ';
	//	}
	//}
	//else
	{
		for (j = 0; j < S.size(); j++)
		{
			cout << pNumber2[j] << ' ';
		}
	}


	delete[] pNumber1;
	delete[] pNumber2;
	return 0;
}

Measured memory_bytes: 1408