Ошибка представления в UVa 10252 - общая перестановка

Код для описанной ниже проблемы, UVa 10252 - Общая перестановка, сделан на C++11 и возвращает тот же вывод, что и uDebug ( https://www.udebug.com/UVa/10252) при использовании их случайного ввода.

Но каждый раз, когда он отправляется в UVa Online Judge, судья возвращает сообщение "Ошибка представления". Мой вопрос: почему, как код может быть изменен, чтобы быть принятым?

Код ниже, после объяснения проблемы.


проблема

Учитывая две строки строчных букв, a и b, выведите самую длинную строку x строчных букв, так что есть перестановка x, которая является подпоследовательностью a, и существует перестановка x, которая является подпоследовательностью b.

вход

Входной файл содержит несколько строк ввода. Последовательные две строки делают набор ввода. Это означает, что во входном файле строки 1 и 2 - это набор ввода, строки 3 и 4 - это набор ввода и так далее. Первая строка пары содержит a, а вторая содержит b. Каждая строка находится на отдельной строке и состоит не более чем из 1000 строчных букв.

Выход

Для каждого набора входных данных выведите строку, содержащую x. Если несколько х удовлетворяют критериям, указанным выше, выберите первый в алфавитном порядке.

Выборочный ввод и выборочный вывод

https://uva.onlinejudge.org/external/102/10252.pdf Так как я не смог правильно отформатировать оба здесь.


#include <iostream>
#include <fstream>
#include <unordered_map>
#include <algorithm> 
#include <string>
#include <ctype.h>
using namespace std;

void mapear_string(unordered_map<char, int>& letras, string palavra){
    for (int i = 0; i < palavra.size(); i++){
        letras[palavra.at(i)] += 1;
    }
    return;
}

int main() {

    string entrada;
    string palavra_a;
    unordered_map <char, int> letras_de_a;
    unordered_map <char, int> letras_de_b;

    int vezes;

    string saida;

    while (!cin.eof()){

        //limpando os unsorted_maps
        letras_de_a.clear();
        letras_de_b.clear();
        //limpando a string de saida
        saida = "";

        // ...fazer um unsorted_map com a contagem de letras de cada palavra
        getline(std::cin, entrada);
        palavra_a = entrada;
        sort(palavra_a.begin(), palavra_a.end());
        mapear_string(letras_de_a, entrada);
        getline(std::cin, entrada);
        mapear_string(letras_de_b, entrada);

        // para cada letra em a(não repetir)
        for (int i = 0; i < palavra_a.size(); i++){
            //  procurar se a letra existe em b.
            if (islower(palavra_a.at(i))) {
                if (letras_de_b.count(palavra_a.at(i))){

                    vezes = min(letras_de_a[palavra_a.at(i)], letras_de_b[palavra_a.at(i)]);

                    // se existir em b, fazer um min da quantidade em a e em b, e adicionar ao string de saída.
                    for (int j = 0; j < vezes; j++){
                        saida += palavra_a.at(i);
                    }
                    letras_de_a.erase(palavra_a[i]);
                    letras_de_b.erase(palavra_a[i]);
                }
            }


        }
        // fazer sort da string de saída
        //sort(saida.begin(), saida.end());
        // imprimir saída
        printf("%s", saida.c_str());

        cout << "\n";
    }

    //cout << "\n";

    return 0;
}

1 ответ

Нашел решение: в случае, если код достигает eof после первой getline(std::cin, entrada); в то время как это не так, снова читает ту же строку и печатает всю строку.

Добавление if (! Std::cin.good()) return; после того, как первая getline исправила проблему, и код был принят в UVa.

Другие вопросы по тегам