UVa 10252中的演示错误 - 常见排列

时间:2016-04-18 19:33:01

标签: algorithm c++11 onlinejudge

以下问题的代码,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;
}

1 个答案:

答案 0 :(得分:0)

找到解决方案:如果代码在第一个 getline(std :: cin,entrada)之后到达eof; 在while内部,它不会再次读取相同的行并打印整行。

在第一个getline修复问题并且代码在UVa中被接受后,添加 if(!std :: cin.good())return;