Given is a string S consisting of `L` and `R`.

Let N be the length of S. There are N squares arranged from left to right, and the i-th character of S from the left is written on the i-th square from the left.

The character written on the leftmost square is always `R`, and the character written on the rightmost square is always `L`.

Initially, one child is standing on each square.

Each child will perform the move below 10^{100} times:

* Move one square in the direction specified by the character written in the square on which the child is standing. `L` denotes left, and `R` denotes right.



Find the number of children standing on each square after the children performed the moves.

Constraints

* S is a string of length between 2 and 10^5 (inclusive).
* Each character of S is `L` or `R`.
* The first and last characters of S are `R` and `L`, respectively.

Input

Input is given from Standard Input in the following format:


S


Output

Print the number of children standing on each square after the children performed the moves, in order from left to right.

Examples

Input

RRLRL


Output

0 1 2 1 1


Input

RRLLLLRLRRLL


Output

0 3 3 0 0 0 1 1 0 2 2 0


Input

RRRLLRLLRRRLLLLL


Output

0 0 3 2 0 2 1 0 0 0 4 4 0 0 0 0
import java.util.ArrayList;
import java.util.Scanner;
class Main{


	static char[][] map;
	static final int MOD = 1000000007;


	static long[][] c;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);			//文字の入力

		String s = sc.next();
		ArrayList<Integer> R = new ArrayList<Integer>();
		ArrayList<Integer> L = new ArrayList<Integer>();

		for(int i = 0;i < s.length();i++){
			if(s.charAt(i) == 'R'){
				R.add(i);
			}else{
				L.add(i);
			}
		}
		
//		System.out.println("R");
//		for(int i = 0;i < R.size();i++){
//			System.out.print(R.get(i) + " ");
//			
//		}
//		System.out.println();
//
//		System.out.println("L");
//		for(int i = 0;i < L.size();i++){
//			System.out.print(L.get(i) + " ");
//			
//		}
//		System.out.println();



		int[] ans = new int[s.length()];
		for(int i = 0;i < s.length();i++){
			if(s.charAt(i) == 'R'){
				int next = upperbond(i,L);
//				System.out.println("R " + next);

				if((next - i) % 2 == 0){
					ans[next]++;
				}else{
					ans[next-1]++;
				}
			}else{
				int next = lowerbond(i,R);
//				System.out.println("L " + next);

				if((i - next) % 2 == 0){
					ans[next]++;
				}else{
					ans[next+1]++;
				}
			}
		}


		for(int i = 0;i < s.length();i++){
			System.out.print(ans[i] + " ");
		}



	}
	
	

	static int upperbond(int k, ArrayList<Integer> data){		//kより小さい最大の値をdataの中から探し、返す二分探索
		int min = -1;
		int max = data.size();

		while(max-min > 1){
			int mid = (max+min)/2;
			if(data.get(mid) > k){
				max = mid;
			}else{
				min = mid;
			}
		}
		return data.get(max);
	}

	static int lowerbond(int k, ArrayList<Integer> data){		//kより小さい最小の値をdataの中から探し、返す二分探索
		int min = -1;
		int max = data.size();

		while(max-min > 1){
			int mid = (max+min)/2;
			if(data.get(mid) >= k){
				max = mid;
			}else{
				min = mid;
			}
		}
		return data.get(min);
	}



	static int gcd(int a,int b){				//最大公約数を返す
		if(b == 0){
			return a;
		}else{
			return gcd(b, a%b);
		}
	}
	static long gcd(long a,long b){
		if(b == 0){
			return a;
		}else{
			return gcd(b, a%b);
		}
	}



	static long lcm (long a, long b) {
		long g = gcd(a,b);
		return a/g*b;
	}




}



class Pair implements Comparable{
	int from;
	int end;
	@Override
	public int compareTo(Object other) {
		Pair otherpair = (Pair)other;

		return   end- otherpair.end;
	}








}




