Задать вопрос
@Acvik2402

Алгоритм не принимается валидатором, что в нем не так?

Добрый день,
возник вопрос над тестовым заданием. не могу понять к чему мог прицепиться валидатор

Условие задачи

Ограничение времени, с 1
Ограничение памяти, МБ 64
Общее число попыток отправки 15

На вход подается 2 подстроки. Нужно определить, можно ли превратить первую во вторую, заменяя одни буквы на другие, с учетом следующих правил:

- участвуют только буквы русского алфавита а-я;
- все буквы в нижнем регистре;
- за один шаг нужно преобразовать все вхождения одной буквы в другую букву.

Входные данные
Входная информация поступает из стандартного ввода в виде одной строки. В этой строке содержатся две подстроки, разделенные пробелом. Ваше решение должно учитывать вариант, когда на вход поданы строки разной длины. Некорректные данные на вход не поступают, дополнительные проверки не требуются.

Выходные данные
В качестве ответа в стандартный вывод программа должна выводить 1 (если превратить можно) или 0 (если превратить нельзя).

Пример 1
Входные данные: привет прикол
Выходные данные: 1
Преобразования (выводить не нужно):
в ⇒ к (прикет)
е ⇒ о (прикот)
т ⇒ л (прикол)

Пример 2
Входные данные: ааббдд ддббаа
Выходные данные: 1
Преобразования (выводить не нужно):
д ⇒ я (ааббяя)
а ⇒ д (ддббяя)
я ⇒ а (ддббаа)

Пример 3
Входные данные: абаб ааах
Выходные данные: 0
Преобразовать нельзя, так как 'б' не сможет оказаться одновременно 'а' и 'х'.

Примечания по оформлению решения
При отправке решений на Java необходимо назвать исполняемый класс Main. В решении не нужно указывать пакет.

Для работы со стандартным потоком ввода в JS используйте require('readline'), а для работы со стандартным потоком вывода - console.log(String(data)).

Пример ввода-вывода на JS:

const readline = require('readline');
const rl = readline.createInterface(process.stdin, process.stdout);
rl.on('line', (line) => {
// Введенная строка в переменной line, тут можно написать решение
console.log(String(result));
rl.close();
return;
}).on('close', () => process.exit(0));

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {

    //сделал возвращаемый int а не boolean тк в задании указано что требуется именно 1 или 0
    public static void main(String[] args) {
//        long m = System.currentTimeMillis();
//        long usedBytes = Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory();
//        System.out.println(check("привет прикол"));
//        System.out.println(check("абвгдеёжзийклмнопрстуфхцчшщъыьэюя яюэьыъщшчцхфутсрпонмлкйизжёедгвба"));

//        System.out.println((double) (System.currentTimeMillis() - m));
//        System.out.println(usedBytes/1048576 + "m");
//        System.out.println(check(args[0]));
        try(Scanner scanner = new Scanner(System.in)) {
            String str = "";
            str = scanner.nextLine();
            System.out.println(check(str));
        }
    }
    public static int check(String str){
        if (str == null) {
            return 0;
        } else if (!(str.matches("^[а-яё]+\\s[а-яё]+$"))) {
            return 0;
        }
        String[] strings = str.trim().split(" ");
        String first = strings[0];
        String second = strings[1];
        if (first.length() != second.length()) {
            return 0;
        } else if (first.equals(second)) {
            return 1;

//        } else if (!(first.matches("^[а-я]+$")&&second.matches("^[а-я]+$"))) {
//            return 0;
        } else {
            Map<Character, Character> map1 = new HashMap<>();
            Map<Character, Character> map2 = new HashMap<>();

            char[] firstChars = first.toCharArray();
            char[] secondChars = second.toCharArray();
            //-->

            for (int i = 0; i < firstChars.length; i++) {
                if (map1.containsKey(firstChars[i])) {
                    if (secondChars[i]!=map1.get(firstChars[i]))
                        return 0;
                } else {
                    map1.put(firstChars[i], secondChars[i]);
                }

            }
            //<--
            for (int j = 0; j < secondChars.length; j++) {
                if (map2.containsKey(secondChars[j])) {
                    if (firstChars[j] != map2.get(secondChars[j]))
                        return 0;
                } else {
                    map2.put(secondChars[j], firstChars[j]);
                }
            }
            if (map1.size() == 33&&map2.size()==33) {
                return 0;
            }
        }
        return 1;
    }
}


Все мои мыслимые и немыслимые тесты проходит, а Валя не принимает...
По времени и памяти вроде бы тоже укладываюсь, если я не напутал что-то

Что я упустил? уже 10 попыток спалил из 15ти пытаясь понять что не так
  • Вопрос задан
  • 231 просмотр
Подписаться 1 Средний 1 комментарий
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
'абвгдеёжзийклмнопрстуфхцчшщъыьэюя' => 'бавгдеёжзийклмнопрстуфхцчшщъыьэюя'
Результат должен быть 0, у вас 1.
Фокус в том, что если есть цикл замен (а => б => а), то должна быть хоть одна свободная буква для того, чтобы разорвать этот цикл. При этом цикл может быть из произвольного количества замен (а => б => в => г => а). Учитывайте, что буква может освободиться при предыдущих заменах.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы