2016-04-18 9 views
0

以下の問題のコードであるUVa 10252 - 共通の置換は、C++ 11で作成され、ランダム入力を使用するときはuDebug(https://www.udebug.com/UVa/10252)と同じ出力を返します。UVa 10252プレゼンテーションエラー - 一般的な置換

しかし、たびにUVaオンラインジャッジに送られ、ジャッジは「プレゼンテーションエラー」を返します。私の質問は:なぜ、どのようにコードを受け入れられるように変更することができるのですか?

問題の説明後、以下のコードを入力してください。


問題

は小文字の二つの文字列、AとBとを考えると、そこの部分配列であり、xの順列があるよう 小文字のx最長の文字列を印刷bの サブシーケンスであるxの順列です。

入力

入力ファイルは、入力の複数の行が含まれています。連続する2行が一連の入力を行います。つまり、 入力ファイルの行1と2は入力の集合であり、3行目と4は入力の集合であるということを意味します。ペア の最初の行にはaが含まれ、2番目の行には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

:最初のgetline(STD :: CIN、エントラーダ)の後にコード到達EOFの場合と、は中に入っていますが、同じ行をもう一度読み込み、行全体を出力します。

を追加すると、(!std :: cin.good())が返されます。最初のgetlineの後にが問題を修正し、コードがUVaでAcceptedになりました。

関連する問題