Ошибка представления в 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.