以下问题的代码,UVa 10252 - Common Permutation,在C ++ 11中制作,并在使用随机输入时返回与uDebug(https://www.udebug.com/UVa/10252)相同的输出。
但每次将其发送给UVa Online Judge时,法官都会返回" Presentation Error"。我的问题是:为什么,代码如何被改变为被接受?
在解释问题后,下面的代码。
问题
给定两个小写字母串a和b,打印最长的字母x,如小写字母 有一个x的排列是a的一个子序列,并且有一个x的排列是一个 b的后续序列。
输入
输入文件包含几行输入。连续两行构成一组输入。这意味着 输入文件行1和2是一组输入,第3行和第4行是一组输入,依此类推。一对的第一行 包含a,第二个包含b。每个字符串都在一个单独的行上,最多包含1000个字符串 小写字母。
输出
对于每组输入,输出包含x的行。如果几个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;
}
答案 0 :(得分:0)
找到解决方案:如果代码在第一个 getline(std :: cin,entrada)之后到达eof; 在while内部,它不会再次读取相同的行并打印整行。
在第一个getline修复问题并且代码在UVa中被接受后,添加 if(!std :: cin.good())return; 。