Some dwarves that are finishing the StUDY (State University for Dwarven Youngsters) Bachelor courses, have been told "no genome, no degree". That means that all dwarves should write a thesis on genome. Dwarven genome is far from simple. It is represented by a string that consists of lowercase Latin letters.

Dwarf Misha has already chosen the subject for his thesis: determining by two dwarven genomes, whether they belong to the same race. Two dwarves belong to the same race if we can swap two characters in the first dwarf's genome and get the second dwarf's genome as a result. Help Dwarf Misha and find out whether two gnomes belong to the same race or not.

Input

The first line contains the first dwarf's genome: a non-empty string, consisting of lowercase Latin letters.

The second line contains the second dwarf's genome: a non-empty string, consisting of lowercase Latin letters.

The number of letters in each genome doesn't exceed 105. It is guaranteed that the strings that correspond to the genomes are different. The given genomes may have different length.

Output

Print "YES", if the dwarves belong to the same race. Otherwise, print "NO".

Examples

Input

ab
ba


Output

YES


Input

aa
ab


Output

NO

Note

  * First example: you can simply swap two letters in string "ab". So we get "ba". 
  * Second example: we can't change string "aa" into string "ab", because "aa" does not contain letter "b". 
import java.io.*;
import java.util.*;

public class Codeforces {

	private static Print writer;

	private static Scan reader;

	static class Scan {
		private byte[] buf = new byte[1024]; // Buffer of Bytes
		private int index;
		private InputStream in;
		private int total;

		public Scan() throws IOException {
			in = System.in;
		}

		int next() throws IOException { // Scan method used to scan buf
			if (total < 0)
				throw new InputMismatchException();
			if (index >= total) {
				index = 0;
				total = in.read(buf);
				if (total <= 0)
					return -1;
			}
			return buf[index++];
		}

		int ni() throws IOException {
			int integer = 0;
			int n = next();
			while (isWhiteSpace(n)) // Removing startPointing whitespaces
				n = next();
			int neg = 1;
			if (n == '-') { // If Negative Sign encounters
				neg = -1;
				n = next();
			}
			while (!isWhiteSpace(n)) {
				if (n >= '0' && n <= '9') {
					integer *= 10;
					integer += n - '0';
					n = next();
				} else
					throw new InputMismatchException();
			}
			return neg * integer;
		}

		long nl() throws IOException {
			long integer = 0;
			int n = next();
			while (isWhiteSpace(n)) // Removing startPointing whitespaces
				n = next();
			int neg = 1;
			if (n == '-') { // If Negative Sign encounters
				neg = -1;
				n = next();
			}
			while (!isWhiteSpace(n)) {
				if (n >= '0' && n <= '9') {
					integer *= 10;
					integer += n - '0';
					n = next();
				} else
					throw new InputMismatchException();
			}
			return neg * integer;
		}

		String line() throws IOException {
			StringBuilder sb = new StringBuilder();
			int n = next();
			while (isWhiteSpace(n))
				n = next();
			while (!isNewLine(n)) {
				sb.append((char) n);
				n = next();
			}
			return sb.toString();
		}

		private boolean isNewLine(int n) {
			return n == '\n' || n == '\r' || n == -1;
		}

		private boolean isWhiteSpace(int n) {
			return n == ' ' || isNewLine(n) || n == '\t';
		}

		int[] nia(int n) throws Exception {
			if (n < 0)
				throw new Exception("Array size should be non negative");
			int[] array = new int[n];
			for (int i = 0; i < n; i++)
				array[i] = ni();
			return array;
		}

		int[][] n2dia(int r, int c) throws Exception {
			if (r < 0 || c < 0)
				throw new Exception("Array size should be non negative");
			int[][] array = new int[r][c];
			for (int i = 0; i < r; i++)
				array[i] = nia(c);
			return array;
		}

		long[] nla(int n) throws Exception {
			if (n < 0)
				throw new Exception("Array size should be non negative");
			long[] array = new long[n];
			for (int i = 0; i < n; i++)
				array[i] = nl();
			return array;
		}

		float[] nfa(int n) throws Exception {
			if (n < 0)
				throw new Exception("Array size should be non negative");
			float[] array = new float[n];
			for (int i = 0; i < n; i++)
				array[i] = nl();
			return array;
		}

		double[] nda(int n) throws Exception {
			if (n < 0)
				throw new Exception("Array size should be non negative");
			double[] array = new double[n];
			for (int i = 0; i < n; i++)
				array[i] = nl();
			return array;
		}
	}

	static class Print {
		private final BufferedWriter bw;

		Print() {
			bw = new BufferedWriter(new OutputStreamWriter(System.out));
		}

		<T> void print(T str) {
			try {
				bw.append(str.toString());
			} catch (IOException e) {
				System.out.println(e.toString());
			}
		}

		void println() {
			print("\n");
		}

		<T> void println(T str) {
			print(str + "\n");
		}

		void flush() throws IOException {
			bw.flush();
		}

		void close() {
			try {
				bw.close();
			} catch (IOException e) {
				System.out.println(e.toString());
			}
		}
	}

	public static void main(String[] args) throws Exception {
		long startPointTime = System.currentTimeMillis();
		reader = new Scan();
		writer = new Print();
		main2();
		long endTime = System.currentTimeMillis();
		float totalProgramTime = endTime - startPointTime;
		if (args.length > 0 && args[0].equals("time"))
			writer.print("Execution time is " + totalProgramTime + " (" + (totalProgramTime / 1000) + "s)");
		writer.close();
	}

	static class DisjointSet {
		int[] arr;
		int[] size;

		DisjointSet(int n) {
			arr = new int[n + 1];
			size = new int[n + 1];
			makeSet();
		}

		void makeSet() {
			for (int i = 1; i < arr.length; i++) {
				arr[i] = i;
				size[i] = 1;
			}
		}

		void union(int i, int j) {
			if (i == j)
				return;
			if (i > j) {
				i ^= j;
				j ^= i;
				i ^= j;
			}

			i = find(i);
			j = find(j);

			if (i == j)
				return;
			arr[j] = arr[i];
			size[i] += size[j];
			size[j] = size[i];
		}

		int find(int i) {
			if (arr[i] != i) {
				arr[i] = find(arr[i]);
				size[i] = size[arr[i]];
			}
			return arr[i];
		}

		int getSize(int i) {
			i = find(i);
			return size[i];
		}

		public String toString() {
			return Arrays.toString(arr);
		}
	}

	static long MOD = 1_000_000_007L;

	static void main2() throws Exception {
		String a = reader.line();
		String b = reader.line();
		int fi = -1;
		int si = -1;
		if (a.length() != b.length()) {
			writer.println("NO");
			return;
		}
		for (int i = 0; i < a.length(); i++) {
			if (a.charAt(i) != b.charAt(i)) {
				if (fi == -1 && si == -1) {
					fi = i;
				} else if (si == -1) {
					si = i;
				} else {
					writer.println("NO");
					return;
				}
			}
		}
		if (si == -1 && fi == -1) {
			writer.println("YES");
		} else if (si == -1 && fi != -1) {
			writer.println("NO");
		} else if (a.charAt(fi) != b.charAt(si) || a.charAt(si) != b.charAt(fi)) {
			writer.println("NO");
		} else {
			writer.println("YES");
		}
	}

	static long gcd(long a, long b) {
		if (b == 0)
			return a;
		return gcd(b, a % b);
	}
}