package is2.lemmatizer;

import is2.util.DB;

import java.util.ArrayList;

public class StringEdit {


	public static void main(String args[]) {

		

		String s = new StringBuffer(args[0]).reverse().toString();
		String t = new StringBuffer(args[1]).reverse().toString();
		
		int d[][] = LD(s, t);

		

		StringBuffer opersations = new StringBuffer();
		searchPath(s,t,d, opersations, false);
		System.out.println("resuylt "+" "+opersations);

	}





	//****************************
	// Get minimum of three values
	//****************************

	static private int Minimum (int a, int b, int c) {
		int mi;

		mi = a;
		if (b < mi)  mi = b;
		if (c < mi)  mi = c;
		
		return mi;

	}

	//*****************************
	// Compute Levenshtein distance
	//*****************************

	static public int[][] LD (String s, String t) {
		 
		int n = s.length ();
		int m = t.length ();; // length of t
	//	char s_i; // ith character of s
	//	char t_j; // jth character of t
		int cost; // cost

		// Step 1

		
		int[][] d = new int[n+1][m+1];

		if (n == 0)  return d;
		if (m == 0)  return d;
		
		// Step 2

		for (int i = 0; i <= n; i++) d[i][0] = i;
		for (int j = 0; j <= m; j++) d[0][j] = j;
		

		// Step 3

		for (int i = 1; i <= n; i++) {

			int s_i = s.charAt (i - 1);

			// Step 4

			for (int j = 1; j <= m; j++) {

//				t_j = t.charAt (j - 1);

				// Step 5

				if (s_i == t.charAt (j - 1))  cost = 0;
				else cost = 1;
				

				// Step 6

				d[i][j] = Minimum (d[i-1][j]+1, d[i][j-1]+1, d[i-1][j-1] + cost);

			}

		}

		// Step 7
		
		

		return d;

	}





	static String searchPath(String s, String t, int[][] d, StringBuffer operations, boolean debug) {
	
		StringBuffer result = new StringBuffer(s);
		
		int n = d.length;
		int m = d[0].length;
		
		int x=n-1;
		int y=m-1;
		boolean changed =false;
		while(true) {
			if (debug && changed )System.out.println("result "+new StringBuffer(result)  .reverse());
			
			if (d[x][y]==0)break;
			if (y>0&&x>0&& d[x-1][y-1]<d[x][y]) {
				if (debug) System.out.println("min d[x-1][y-1] "+d[x-1][y-1]+" d[x][y] "+d[x][y]+" rep "+s.charAt(x-1)+" with "+t.charAt(y-1)+" at "+(x-1)); 
				
				operations.append('R').append(Character.toString((char)((int)x-1))).append(s.charAt(x-1)).append(t.charAt(y-1));
				if (debug) result.setCharAt(x-1, t.charAt(y-1));
				y--;
				x--;
				changed =true;
				continue;
			}
			if (y>0&& d[x][y-1]<d[x][y]) {
				if (debug) System.out.println("min d[x][y-1] "+d[x][y-1]+"  d[x][y] "+d[x][y]+" ins "+t.charAt(y-1)+" at "+(x)); 
				operations.append('I').append(Character.toString((char)((int)x))).append(t.charAt(y-1));
				if (debug)result.insert(x, t.charAt(y-1));
				y--;
				changed =true;
				continue;
			}
			if (x>0&& d[x-1][y]<d[x][y]) {
				if (debug)System.out.println("min d[x-1][y] "+d[x-1][y]+" d[x][y] "+d[x][y]+" del "+s.charAt(x-1)+" at "+(x-1)); 
				operations.append('D').append(Character.toString((char)((int)x-1))).append(s.charAt(x-1));
				if (debug)result.deleteCharAt(x-1);
				x--;
				changed =true;
				continue;
			}
			changed =false;
			if (x>0&& y>0 && d[x-1][y-1]==d[x][y]) {
				x--; y--;
				continue ;
			}
			if (x>0&&  d[x-1][y]==d[x][y]) {
				x--; 
				continue;
			}
			if (y>0 && d[x][y-1]==d[x][y]) {
				y--;
				continue;
			}
			
		}
		if (debug) return result.reverse().toString();
		else return null;
	}

	public static String change(String s, String operations) {
		
		StringBuffer result = new StringBuffer(s).reverse();
		
		int pc =0;
		while(true) {
			if (operations.length()<=pc) break;
			char nextOperation = operations.charAt(pc);
			pc++;
			if (nextOperation == 'R') {
				//pc++;
				int xm1 = (char)operations.charAt(pc);
				pc++;
				char replace = operations.charAt(pc);
				pc++;
				char with = operations.charAt(pc);
				//operations.append('R').append((char)x-1).append(s.charAt(x-1)).append(t.charAt(y-1));
			//	System.out.println(""+result+" xm1 "+xm1+" op "+operations);
	
				
				if (result.length()<=xm1) return s; 
			
				if (result.charAt(xm1)==replace) result.setCharAt(xm1, with);
				//if (debug) result.setCharAt(x-1, t.charAt(y-1));
				pc++;
				
			}else if (nextOperation == 'I') {
			//	if (debug) System.out.println("min d[x][y-1] "+d[x][y-1]+"  d[x][y] "+d[x][y]+" ins "+t.charAt(y-1)+" at "+(x)); 
				//operations.append('I').append((char)x).append(t.charAt(y-1));
				
				//if (debug)result.insert(x, t.charAt(y-1));
				//y--;
				//changed =true;
				//pc++;
				int x = operations.charAt(pc);
				pc++;
				char in = operations.charAt(pc);
			
				if (result.length()<x) return s; 
				
				result.insert(x, in);
				pc++;
			} else if (nextOperation == 'D' ) {
				//pc++;
				int xm1 = operations.charAt(pc);
				
				
				if (result.length()<=xm1) return s; 
				
				result.deleteCharAt(xm1);
				pc++;
				// delete with
				pc++;
		//		operations.append('D').append((char)x-1).append(s.charAt(x-1));
			//	if (debug)result.deleteCharAt(x-1);
			}
			
		}
		return result.reverse().toString();
		//else return null;
	}





	



	







	/**
	 * @param opers
	 * @param postion
	 * @return
	 */
	public static String get(ArrayList<String> opers, int position) {
		for(String s : opers) {
			int p = (int)s.charAt(1);
			if (p==position) {
				return s;
			}
		}
		return "0";
	}





	/**
	 * @param form
	 * @param string
	 * @param c
	 * @return
	 */
	public static String changeSimple(String form, String operation, int c) {
		
		if (operation.equals("0")) return form;
		
		if (operation.charAt(0)=='I') {
			StringBuffer f = new StringBuffer(form);
			if (f.length()<=c) {
			//	DB.println("fail insert ");
				return form;
			}
			f.insert(c+1, operation.charAt(1));
			return f.toString();
		}
		if (operation.charAt(0)=='R') {
			StringBuffer f = new StringBuffer(form);
	//		if (f.length()<=c) f.append(' ');
			if (f.length()<=c) {
			//	DB.println("fail replace ");
				return form;
			}
			f.setCharAt(c, operation.charAt(2));
			return f.toString();
		}
		
		if (operation.charAt(0)=='D') {
			StringBuffer f = new StringBuffer(form);
			f.delete(c, c+1);//.append(' ');
			return f.toString();
		}
		return form;
	}





	/**
	 * @param string
	 * @return
	 */
	public static String simple(String o) {
		StringBuffer s = new StringBuffer(o);
		s.delete(1, 2);
		return s.toString();
	}

}
