Задача
Два слова называются анаграмматически одинаковыми, если из букв одного слова можно получить другое слово. Например, occurs является анаграммой для слова succor; и наоборот, dear не является анаграммой слова dared (так как буква d встречается дважды в dared, и только один раз в dear). Наиболее известной английской анаграммой являются слова dog и god.
Анаграмматическим расстоянием двух слов называется минимальное количество букв, которые нужно удалить, чтобы в результате два слова стали анаграмматически одинаковыми. Например, для слов sleep и leap, нужно удалить как минимум три буквы — две из sleep и одну из leap — чтобы остались анаграмматически одинаковые слова (в указанном случае lep). А для слов dog и cat, в которых нет одинаковых букв, анаграмматическое расстояние равно $6$, так как нужно удалить все буквы. (Любое слово, в том числе и пустая строка, являются анаграммой само к себе.)
Ваша задача найти анаграмматическое расстояние для заданных двух слов.
Входные данные
В первой строке задано положительное целое число $N$ (не превышающее $60000$), указывающее количество тестовых примеров. Каждый тестовый пример состоит из двух слов, возможно пустых, каждое из которых записано в отдельной строке (всего $2N$ последующих строк).
Все слова, имеющие не нулевую длину, сформированы из строчных букв английского алфавита (abcdefghijklmnopqrstuvwxyz). Самым длинным словом является pneumonoultramicroscopicsilicovolcanoconiosis.
Выходные данные
Для каждого примера входных данных вывести в отдельной строке номер тестового случая и анаграмматическое расстояние, отформатированные так, как показано в примере выходных данных.
Тесты
Входные данные | Выходные данные |
4 crocus succor dares seared empty smell |
Case #1: 0 Case #2: 1 Case #3: 5 Case #4: 4 |
3 dog god cat dog dragon fly |
Case #1: 0 Case #2: 6 Case #3: 9 |
1 cow |
Case #1: 3 |
1 memory moratory |
Case #1: 6 |
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import java.io.BufferedReader; import java.io.InputStreamReader; public class Main { public static void main (String[] args) throws Exception{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); final int ABC_SIZE = 26; int n = Integer.parseInt(br.readLine()); for (int i = 0; i < n; i++) { int[] counters = new int[ABC_SIZE]; String firstWord = br.readLine(); for (int j = 0; j < firstWord.length(); j++) { counters[firstWord.charAt(j) - 'a']++; } String secondWord = br.readLine(); for (int j = 0; j < secondWord.length(); j++) { counters[secondWord.charAt(j) - 'a']--; } int matchingLetters = 0; for (int k = 0; k < ABC_SIZE; k++) { matchingLetters += Math.abs(counters[k]); } System.out.println("Case #" + (i + 1) + ": " + matchingLetters); } } } |
Решение
Создадим массив на $26$ элементов, соответствующих буквам латинского алфавита. Для каждой буквы первого слова будем увеличивать на $1$ соответствующий ей элемент, а для каждой буквы второго слова — уменьшать. В конце, полученные значения будут указывать на то, сколько в первом слове «лишних» букв по сравнению со вторым (и наоборот, в случае отрицательных значений). Сумма абсолютных значений элементов массива и будет являться анаграмматическим расстоянием для указанных слов.
Ссылки
Условие задачи на e-olymp
Решение на ideone
Решение на e-olymp