import java.io.*;
import java.awt.*;
import java.lang.*;
import java.lang.Math.*;
import java.math.*;

public class flip { 

    public static void main (String[] args) { 

	InputStreamReader istream = new InputStreamReader(System.in) ;
	BufferedReader bufRead = new BufferedReader(istream) ;

	System.out.println("Wow, it's the Incredible Braid Machine!");
	System.out.println("Let's give it a whirl.");
	
	try {
	    int p, threep;
	    System.out.println("Please enter a pseudo-Anosov word. ");
	    String word = bufRead.readLine();
	    char[] funk, funkotron;
	    String flop;
	    double[] flake, flow, flowlike, fabulous, great, invariant;
	    int[] Crazy, Crazylike, braidness;
	    flake = new double[100000];
	    flow = new double[100000];
	    flowlike = new double[100000];
	    Crazy = new int[100000];
	    Crazylike = new int[100000];
	    fabulous = new double[100000];
	    great = new double[100000];
	    braidness = new int[100000];
	    invariant = new double[3];
	    flake[0] = 0;
	    flake[1] = 0.5;
	    flake[2] = 1;
	    flake[3] = 1.5;
	    flake[4] = 2;
	    char flap;
	    p = word.length();
	    threep = 3*p;
	    int j, places, placesZ, fabsize, moop;
	    moop = -1;
	    fabsize = 0;
	    double l, gibberishness;
	    places = 5;
	    funk = word.toCharArray();
	    System.out.print("You entered ");
	    System.out.print(funk);
	    System.out.println(".");
	    funkotron = cubing(p, funk);
	    places = apply(threep, places, funkotron, flake);
	    int i;
	    i=1;
	    for(i=1; i<places; i++){
		flow[i-1] = (flake[i-1]+flake[i])/2;
	    }
	    placesZ = places - 1;
	    fabsize = splendidtoo(threep, placesZ, funkotron, flow, Crazy, fabsize, fabulous);
	    flake[0] = 0; 
            flake[1] = 0.5; 
            flake[2] = 1;
            flake[3] = 1.5;
            flake[4] = 2;
	    places = 5;
	    fabsize = 0;
	    places = apply(p, places, funk, flake); 
            i=1; 
            for(i=1; i<places; i++){    
                flowlike[i-1] = (flake[i-1]+flake[i])/2;
            }
            placesZ = places - 1; 
            fabsize = splendidtoo(p, placesZ, funk, flowlike, Crazylike, fabsize, great);
	    System.out.println("Please enter a point");
	    BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in)); 
            double gibberish = Double.valueOf(keyboard.readLine()).doubleValue();
	    gibberishness = Wheredthepointgo(gibberish, p, funk);
	    System.out.println(gibberishness);
	    gibberishness = Wheredthepointgo(gibberishness, p, funk);
	    System.out.println(gibberishness);
	    System.out.println("Please enter the first point");                
            double gonzo = Double.valueOf(keyboard.readLine()).doubleValue();
	    System.out.println("Please enter the second point");
   	    double agonzo = Double.valueOf(keyboard.readLine()).doubleValue();
	    System.out.println("Finally, enter the third point");
	    double bgonzo = Double.valueOf(keyboard.readLine()).doubleValue();
	    invariant[0] = gonzo;
	    invariant[1] = agonzo;
	    invariant[2] = bgonzo;
	    braidness = braiding(invariant, p, funk);
	    moop = braidingtoo(invariant, p, funk);
	    moop = moop+1;
	    System.out.println("The induced braid is given by:");
	    printytoo(moop, braidness);
	}

	catch (IOException err) {
	    System.out.println("Error reading line");
	}    
    } 

    public static void printy(int k, double[] Wow){
	int i;
	i=0;
	System.out.print("[");
	for(i=0; i<k; i++){
	    System.out.print(Wow[i]);
	    System.out.print(" , ");
	}
	System.out.println("]");
    }	

    public static void printytoo(int k, int[] Wow){
	int i;
	i = 0;
	System.out.println();
	System.out.print("[");
	for(i=0; i<k; i++){
	    System.out.print(Wow[i]);
	    System.out.print(", ");
	}
	System.out.println("]");
    }

    public static int wacky(double n, int k, double[] Wow){
	int i;
	int result;
	result = 0;
	for(i=0; i<k; i=i+1){
	    double f;
	    f = n - Wow[i];
	    if ((f < 0.0000001) && (f > -0.0000001)){
		result = 1;
	    }
	}
    return result;
    }

    public static void sorty(int k, double[] Wow){
	int i, j, p, r;
	i = 0;
	double q;
	for(i=0; i<k; i=i+1){
	    j = 0;
	    p = 0;
	    while ((j < i) && (p == 0)){
		if (Wow[j] > Wow[i]){
		    q = Wow[i];
		    r = i;
		    while (r > j){
			Wow[r] = Wow[r-1];
			r = r - 1;
		    }
		    Wow[j] = q;
		    p = 1;
		}
		j = j+1;
	    }
	}    
    }

    public static double[] sortysorty(int k, double[] Wow){
        int i, j, p, r;
        i = 0;
        double q;
        for(i=0; i<k; i=i+1){
            j = 0;
            p = 0; 
            while ((j < i) && (p == 0)){
                if (Wow[j] > Wow[i]){
                    q = Wow[i];
                    r = i;
                    while (r > j){
                        Wow[r] = Wow[r-1];
                        r = r - 1;
                    } 
                    Wow[j] = q;
                    p = 1; 
                } 
                j = j+1; 
            } 
        }
	return Wow;
    } 

    public static int left(int k, double[] Wow){
	int letters, i;
	double a, b, c, d;
	letters = 1;
	double[] Tea;
	Tea = new double[100000];
	Tea[0] = 0;
	for(i=0; i<k; i++){
	    a = 1 - Wow[i];
	    b = (Wow[i])/2 + 1;
	    c = wacky(a, letters, Tea);
	    if ((0 <= a) && (a <= 2) && (c == 0)){
		Tea[letters] = a;
		letters = letters+1;
	    }
	    d = wacky(b, letters, Tea);
	    if ((0 <= b) && (b <= 2) && (d == 0)){
		Tea[letters] = b;
		letters = letters+1;
	    }	
	}    
	i = 0;
	for(i=0; i<letters; i++){
	    Wow[i] = Tea[i];
	}    
	k = letters;
	sorty(k, Wow);
	return k;
    }

    public static int right(int k, double[] Wow){
	int letters, i;
	double a, b, c, d;
	letters = 1;
	double[] Tea;
	Tea = new double[100000];
	Tea[0] = 0;
	for(i=0; i<k; i++){
	    a = Wow[i]/2;
	    b = 3 - Wow[i];
	    c = wacky(a, letters, Tea);
	    if ((0 <= a) && (a <= 2) && (c == 0)){
		Tea[letters] = a;
		letters = letters+1;
	    }
	    d = wacky(b, letters, Tea);
	    if ((0 <= b) && (b <= 2) && (d == 0)){
		Tea[letters] = b;
		letters = letters+1;
	    }
	}    
	i=0;
	for(i=0; i<letters; i++){
	    Wow[i] = Tea[i];
	}
	k = letters;
	sorty(k, Wow);
	return k;
    }

    public static int apply(int k, int w, char[] funky, double[] Wow){
	int i;
	i=0;
	for(i=0; i<k; i++){
	    if(funky[i] == 'L'){
		w = left(w, Wow);
	    }
	    else{
		w = right(w, Wow);
	    }	
        }
	return w;
    }

    public static double splendid(int k, double l, char[] funky, int fabsize, double[] fabulous){
	double m, t, a, b;
	a = 1;
	b = 0;
	m = l;
	int i;
	i = k-1;
	for(i=k-1; i>=0; i=i-1){
	    if(funky[i] == 'L'){
		if(m <= 1){
		    m = 1 - m;
		    a = -a;
		    b = 1-b;
		}
		else{
		    m = 2*(m-1);
		    a = 2*a;
		    b = 2*(b-1);
		}    
	    }
	    else{
		if(m <= 1){
		    m = 2*m;
		    a = 2*a;
		    b = 2*b;
		}
		else{
		    m = 3 - m;
		    a = -a;
		    b = 3-b;
		}
	    }
	}
	t = -(b/(a-1));
	fabulous[fabsize] = t;
       	return m;
    }

    public static int splendidtoo(int k, int l, char[] funky, double[] funkytoo, int[] funkythree, int fabsize, double[] fabulous){
	int i, j;
	i = 0;
	j = l;
	double phla, phlam;
	int phlammo;
	for(i=0; i<j; i++){
	    phla = funkytoo[i];
	    phlam = splendid(k, phla, funky, fabsize, fabulous);
	    if((0<=phlam) && (phlam<=0.5) && (0<=phla) && (phla<=0.5)){
		phlammo = 1;
		fabsize = fabsize+1;
	    }
	    else if ((0.5<=phlam) && (phlam<=1) && (0.5<=phla) && (phla<=1)){
		phlammo = 1;
		fabsize = fabsize+1;
	    }
	    else if ((1<=phlam) && (phlam<=1.5) && (1<=phla) && (phla<=1.5)){
		phlammo = 1;
		fabsize = fabsize+1;
	    }
	    else if ((1.5<=phlam) && (phlam<=2) && (1.5<=phla) && (phla<=2)){
		phlammo = 1;
		fabsize = fabsize+1;
	    }
	    else{
		phlammo = 0;
	    }
	    funkythree[i] = phlammo;
	}
	System.out.println("The fixed points of the cubed word are:");
	printy(fabsize, fabulous);
	System.out.print("The number of fixed points of the cubed word is ");
	System.out.print(fabsize);
	System.out.println(".");
	return fabsize;
    }

    public static void fixedpoints(int k, int l, char[] funky, double[] funkytoo, int[] funkythree, double[] fabulous){
	System.out.println("The fixed points are:");



    }

    public static int ZowR(double invariantz[], int[] braid, int q){
	double a, b, c;
	a = invariantz[0];
	b = invariantz[1];
	c = invariantz[2];
	if((a>=0.9999999) && (b>=0.9999999) && (c>=0.9999999)){
		braid[q+1] = -2;
		braid[q+2] = -1;
		braid[q+3] = -2;
		a = 3 - a;
		b = 3 - b;
		c = 3 - c;
		q = q+3;
		System.out.println("6");
	}
	else if ((b>=0.9999999) && (c>=0.9999999)){
		a = 2*a;
		b = 3 - b;
		c = 3 - c;
		braid[q+1] = -2;
		if (a<c){
			q = q+1;
		}
		else if (a<b){
			braid[q+2] = -1;
			q = q+2;
		}
		else{
			braid[q+2] = -1;
			braid[q+3] = -2;
			q = q+3;
		}
		System.out.println("7");	
	}
	else if (c>=0.9999999){
		a = 2*a;
		b = 2*b;
		c = 3 - c;
		if (c<a){
			braid[q+1] = -2;
			braid[q+2] = -1;
			q = q+2;
		}
		else if (c<b){
			braid[q+1] = -2;
			q = q+1;
		}
		System.out.println("8");
	}
	else{
		a = 2*a;
		b = 2*b;
		c = 2*c;
		System.out.println("9");
        }
	return q;
    }

    public static int[] ZowRlox(double invariantz[], int[] braid, int q){
	double a, b, c;
	a = invariantz[0];
	b = invariantz[1];
	c = invariantz[2];
        if((a>=0.9999999) && (b>=0.9999999) && (c>=0.9999999)){
                braid[q+1] = -2;
                braid[q+2] = -1;
                braid[q+3] = -2;
                a = 3 - a; 
                b = 3 - b;
                c = 3 - c; 
                q = q+3; 
        } 
        else if ((b>=0.9999999) && (c>=0.9999999)){ 
                a = 2*a; 
                b = 3 - b; 
                c = 3 - c;
                braid[q+1] = -2;
                if (a<c){
                        q = q+1; 
                } 
                else if (a<b){
                        braid[q+2] = -1;
                        q = q+2;
                }
                else{
                        braid[q+2] = -1; 
                        braid[q+3] = -2; 
                        q = q+3;
                } 
        } 
	else if (c>=0.9999999){
                a = 2*a;  
                b = 2*b;  
                c = 3 - c; 
                if (c<a){
                        braid[q+1] = -2; 
                        braid[q+2] = -1;
                        q = q+2;
                } 
                else if (c<b){   
                        braid[q+1] = -2;
                        q = q+1;
                }
        } 
        else{ 
                a = 2*a; 
                b = 2*b;
                c = 2*c;
        } 
        return braid; 
    } 
    
    public static double[] ZowRloxo(double invariantz[], int[] braid, int q){
        double a, b, c;
	a = invariantz[0];
        b = invariantz[1]; 
        c = invariantz[2]; 
        if((a>=0.9999999) && (b>=0.9999999) && (c>=0.9999999)){
                braid[q+1] = -2;
                braid[q+2] = -1;
                braid[q+3] = -2;
                a = 3 - a; 
                b = 3 - b;
                c = 3 - c; 
                q = q+3;  
        } 
        else if ((b>=0.9999999) && (c>=0.9999999)){
                a = 2*a; 
                b = 3 - b;
                c = 3 - c; 
                braid[q+1] = -2; 
                if (a<c){ 
                        q = q+1;
                }
                else if (a<b){
                        braid[q+2] = -1;
                        q = q+2;
                } 
                else{
                        braid[q+2] = -1;
                        braid[q+3] = -2;
                        q = q+3;
                } 
        } 
	 else if (c>=0.9999999){
                a = 2*a;   
                b = 2*b; 
                c = 3 - c; 
                if (c<a){ 
                        braid[q+1] = -2;
                        braid[q+2] = -1;
                        q = q+2;
                } 
                else if (c<b){
                        braid[q+1] = -2;
                        q = q+1; 
                } 
        } 
        else{ 
                a = 2*a; 
                b = 2*b;   
                c = 2*c; 
        } 
	invariantz[0] = a;
	invariantz[1] = b;
	invariantz[2] = c;
        return invariantz; 
    } 

    public static int ZowL(double invariantz[], int[] braid, int q){
	double a, b, c;
	a = invariantz[0];
	b = invariantz[1];
	c = invariantz[2];
        if((a<=1.0000001) && (b<=1.0000001) && (c<=1.0000001)){
                braid[q+1] = 1;
                braid[q+2] = 2;
                braid[q+3] = 1;
                a = 1 - a;
                b = 1 - b;
                c = 1 - c;
                q = q+3;
		System.out.println("6");  
        } 
        else if ((a<=1.0000001) && (b<=1.0000001)){
                a = 1-a; 
                b = 1-b;
                c = 2*(c-1); 
                braid[q+1] = 1; 
                if (c>a){ 
                        q = q+1;
                }
                else if (c>b){
                        braid[q+2] = 2;
                        q = q+2;
                } 
                else{
                        braid[q+2] = 2;
                        braid[q+3] = 1;
                        q = q+3;
                } 
		System.out.println("7");
		System.out.println(a);
		System.out.println(b);
		System.out.println(c);
        } 
	 else if (a<=1.0000001){
                a = 1-a; 
                b = 2*(b-1); 
                c = 2*(c-1); 
                if (a>c){
                        braid[q+1] = 1;
                        braid[q+2] = 2;
                        q = q+2;
                } 
                else if (a>b){
                        braid[q+1] = 1;
                        q = q+1; 
                } 
		System.out.println("8");
        } 
        else{ 
                a = 2*(a-1); 
                b = 2*(b-1); 
                c = 2*(c-1); 
		System.out.println("9");
        } 
        return q;
    } 

    public static int[] ZowLlox(double invariantz[], int[] braid, int q){
	double a, b, c;
	a = invariantz[0];
	b = invariantz[1];
	c = invariantz[2];
        if((a<=1.0000001) && (b<=1.0000001) && (c<=1.0000001)){
                braid[q+1] = 1;
                braid[q+2] = 2;
                braid[q+3] = 1; 
                a = 1 - a;
                b = 1 - b;  
                c = 1 - c;  
                q = q+3; 
        } 
        else if ((a<=1.0000001) && (b<=1.0000001)){
                a = 1-a; 
                b = 1-b;
                c = 2*(c-1);  
                braid[q+1] = 1; 
                if (c>a){ 
                        q = q+1;
                }
                else if (c>b){
                        braid[q+2] = 2;
                        q = q+2;
                } 
                else{
                        braid[q+2] = 2;
                        braid[q+3] = 1;
                        q = q+3;
                }
        }     
	else if (a<=1.0000001){ 
                a = 1-a; 
                b = 2*(b-1);   
                c = 2*(c-1);   
                if (a>c){ 
                        braid[q+1] = 1;
                        braid[q+2] = 2;
                        q = q+2;
                }
                else if (a>b){ 
                        braid[q+1] = 1;
                        q = q+1;
                } 
        } 
        else{ 
                a = 2*(a-1); 
                b = 2*(b-1);
                c = 2*(c-1);  
        } 
        return braid; 
    } 

     public static double[] ZowLloxo(double invariantz[], int[] braid, int q){
        double a, b, c;
	a = invariantz[0];
        b = invariantz[1]; 
        c = invariantz[2]; 
        if((a<=1.0000001) && (b<=1.0000001) && (c<=1.0000001)){
                braid[q+1] = 1;
                braid[q+2] = 2;
                braid[q+3] = 1;
                a = 1 - a;
                b = 1 - b;  
                c = 1 - c;  
                q = q+3; 
        } 
	 else if ((a<=1.0000001) && (b<=1.0000001)){
                a = 1-a; 
                b = 1-b;
                c = 2*(c-1);   
                braid[q+1] = 1; 
                if (c>a){ 
                        q = q+1;
                }
                else if (c>b){
                        braid[q+2] = 2;
                        q = q+2;
                } 
                else{
                        braid[q+2] = 2;
                        braid[q+3] = 1;
                        q = q+3;
                } 
        } 
        else if (a<=1.0000001){
                a = 1-a;  
                b = 2*(b-1); 
                c = 2*(c-1);   
                if (a>c){ 
                        braid[q+1] = 1;
                        braid[q+2] = 2;
                        q = q+2;
                } 
                else if (a>b){
                        braid[q+1] = 1;
                        q = q+1;
                }
        }
	        else{ 
                a = 2*(a-1);    
                b = 2*(b-1);
                c = 2*(c-1); 
        } 
	invariantz[0] = a;
	invariantz[1] = b;
	invariantz[2] = c;
        return invariantz; 
    } 

    public static double Wheredthepointgo(double a, int k, char[] funky){
	int i;
	i = k-1; 
	for(i=k-1; i>=0; i=i-1){ 
            if(funky[i] == 'L'){
                if(a <= 1){ 
                	a = 1-a;
                } 
                else{
                    a = 2*(a-1); 
                }
            } 
            else{ 
                if(a <= 1){ 
                    a = 2*a; 
                } 
                else{ 
                    a = 3-a; 
                } 
            }
        }    
	return a;
    }

    public static char[] cubing(int g, char[] funky){
	char[] funkyflow;
	funkyflow = new char[10000];
	int i, j, gee;
	gee = 3*g;
	i = 0;
	j = 0;
	for(j=0; j<3; j=j+1){
		for(i=0; i<g; i=i+1){
			int t;
			t = (j*g)+i;
			funkyflow[t] = funky[i];	
		}
	} 
	System.out.print("The cubed word is ");
	System.out.print(funkyflow);
	System.out.println(".");
	return funkyflow;
    }

    public static int[] braiding(double[] invariantzes, int pq, char[] funky){
	double door, doors, thedoors;
	door = invariantzes[0];
	doors = invariantzes[1];
	thedoors = invariantzes[2];
	double[] invariantlike;
	invariantlike = new double[3];
	int[] braidmeister, flipmode;
	braidmeister = new int[10000];
	flipmode = new int[10000];
	int i, r, s, v;
	v = 3;
	i = pq-1;
	r = -1;
	invariantzes = sortysorty(v, invariantzes);
	for(i=pq-1; i>=0; i=i-1){
		if (funky[i] == 'L'){
			s = ZowL(invariantzes, braidmeister, r);
			flipmode = ZowLlox(invariantzes, braidmeister, r);
			invariantlike = ZowLloxo(invariantzes, braidmeister, r);
			r = s;
			braidmeister = flipmode;
			invariantzes = invariantlike;
			invariantzes = 	sortysorty(v, invariantzes);
		}
		else if (funky[i] == 'R'){
			s = ZowR(invariantzes, braidmeister, r);
                        flipmode = ZowRlox(invariantzes, braidmeister, r);
                        invariantlike = ZowRloxo(invariantzes, braidmeister, r);
                        r = s;
                        braidmeister = flipmode;
                        invariantzes = invariantlike;
                        invariantzes =  sortysorty(v, invariantzes);
		}
	}
	invariantzes[0] = door;
	invariantzes[1] = doors;
	invariantzes[2] = thedoors;
	return braidmeister;
    }

     public static int braidingtoo(double[] invariantzes, int pq, char[] funky){
        double door, doors, thedoors;
	door = invariantzes[0];
	doors = invariantzes[1];
	thedoors = invariantzes[2];
	double[] invariantlike; 
        invariantlike = new double[3]; 
        int[] braidmeister, flipmode; 
        braidmeister = new int[10000];
        flipmode = new int[10000];
        int i, r, s, v;
        v = 3; 
        i = pq-1;
        r = -1;
	invariantzes = sortysorty(v, invariantzes);
        for(i=pq-1; i>=0; i=i-1){
                if (funky[i] == 'L'){
                        s = ZowL(invariantzes, braidmeister, r);
                        flipmode = ZowLlox(invariantzes, braidmeister, r);
                        invariantlike = ZowLloxo(invariantzes, braidmeister, r);
                        r = s;
                        braidmeister = flipmode;
                        invariantzes = invariantlike;
                        invariantzes =  sortysorty(v, invariantzes);
                }
		 else if (funky[i] == 'R'){
                        s = ZowR(invariantzes, braidmeister, r);
                        flipmode = ZowRlox(invariantzes, braidmeister, r);
                        invariantlike = ZowRloxo(invariantzes, braidmeister, r);
                        r = s; 
                        braidmeister = flipmode; 
                        invariantzes = invariantlike;
                        invariantzes =  sortysorty(v, invariantzes);
                 } 
        } 
	invariantzes[0] = door;
	invariantzes[1] = doors;
	invariantzes[2] = thedoors;
        return r;
    }    


}
