TOPIC

PROBLEM 1519 - URI Fórum 1.0

URI Online Judge asked 7 years ago

URI Online Judge Fórum 1.0

MOD

This topic was solved and cannot recieve new replies.

  • Cristhian Bonilha replied 5 years ago

    O seu erro está na sua contagem de caracteres economizados. Quando a palavra "juiz" é abreviada para "j.", temos um total de 2 caracteres economizados, pois eram 4 e agora são 2 (contando com o ponto). O seu código considera isso um total de 3 caracteres economizados, e isso pode atrapalhar na contagem e escolha final.

    Considere este caso de teste:

    abcdef abc abc abc

    Exatamente roberto. Eu esqueci de avisar no enunciado que não há casos onde duas abreviações resultam na mesma economia. Se isso acontecesse eu teria que ter ditado um regra adicional para desempate, ou considerar mais de uma resposta como correta.

  • Hélio Duarte replied 6 years ago

    Ta dando 10% WA agora.Obg pelo teste.

  • Vinícius replied 4 years ago

    Gente, estou recebendo 40% de W.A. alguém me ajuda por favor.

    #include <iostream>
    #include <map>
    #include <vector>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    
    typedef struct 
    {
        string palavra;
        string abreviation;
        int tam_A;
        int tam;
    }descricion;
    
    bool func1(descricion A, descricion B)
    {
        if(A.tam_A > B.tam_A)
            return true;
        if(A.tam_A == B.tam_A && A.tam > B.tam)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    
    int main(int argc, char *argv[])
    {
        string frase;
        while(getline(cin, frase) && frase != ".")
        {
            map <char, vector<descricion> > mination;
            vector <string> fatori, fat;
            vector <char> prim;
            std:: string str (frase);
            char * cstr = new char [str.length()+1];
            std::strcpy (cstr, str.c_str());
            char * p = std::strtok (cstr," ");
            while(p != 0)
            {
                string aux3 = p;
                bool aux5 = true;
                for(int i=0 ; i<mination[aux3[0]].size() ; i++)
                {
                    if(mination[aux3[0]][i].palavra == aux3)
                        aux5 = false;
                }
                if(aux5)
                {
                    mination[aux3[0]].push_back(descricion());
                    int aux1 = mination[aux3[0]].size()-1;
                    mination[aux3[0]][aux1].palavra = aux3;
                    mination[aux3[0]][aux1].abreviation = aux3[0]+".";
                    mination[aux3[0]][aux1].tam_A = aux3.size()-2;
                    mination[aux3[0]][aux1].tam = aux3.size();
                    prim.push_back(aux3[0]);
                    fat.push_back(aux3);
                }
                else
                {
                    int aux1 = mination[aux3[0]].size()-1;
                    mination[aux3[0]][aux1].tam_A += aux3.size()-2;
                }
                fatori.push_back(aux3);
                p = std::strtok(NULL," ");
            }
            for(int i=0 ; i<prim.size() ; i++)
            {
                sort((mination[prim[i]]).begin(), (mination[prim[i]]).end(), func1);
            }
            int aux4 = 0;
            for(int i=0 ; i<fat.size() ; i++)
            {
                if(mination[fat[i][0]][0].palavra == fat[i] && fat[i].size() > 2)
                    aux4++;
            }
    
            for(int i=0 ; i<fatori.size() ; i++)
            {
                if(mination[fatori[i][0]][0].palavra == fatori[i] && fatori[i].size() > 2)
                {
                    if(i < fatori.size()-1)
                        cout << fatori[i][0] << ". " ;
                    else
                    {
                        cout << fatori[i][0] << "." << endl;
                    }
                }
                else
                {
                    if(i < fatori.size()-1)
                        cout << fatori[i] << " " ;
                    else
                    {
                        cout << fatori[i] << endl;
                    }
                }
            }
            sort(fat.begin(), fat.end());
            cout << aux4 << endl;
            for(int i=0 ; i<fat.size() ; i++)
            {
                if(mination[fat[i][0]][0].palavra == fat[i] && fat[i].size() > 2)
                {
                    cout << fat[i][0] << ". = " << mination[fat[i][0]][0].palavra << endl; 
                }
            }
        }
        return 0;
    }
  • Christian Hideki Maekawa replied 5 years ago

    Não sei porque meu código está dando 10% wrong answers

    #include <iostream>
        #include <sstream>
        #include <utility>
        #include <vector>
        #include <map>
        using namespace std;
    
        void limpaPair(pair<int,string>v[])
        {
            for (int i = 49 ; i < 75; ++i)
            {
                v[i].first = 0;
                v[i].second.clear();
            }
        }
        int main()
        {
            int sum;
            string linha,aux;
            stringstream palavra;
            pair<int,string> abrev[76];//a = 49 e z = 74
            pair<int,string> abrev2[76];
            vector<string>texto;
            map<string,int>mymap;
            sum = 0;
            limpaPair(abrev);
            getline(cin,linha);
            while (linha[0]!='.')
            {
                palavra << linha;
                while (palavra >> aux)
                {
                    texto.push_back(aux);
                    mymap[aux]++;
                }
                for (int i = 0 ; i < (int)texto.size(); ++i)
                {
                    if (texto[i].length() > 2 && abrev[texto[i][0]-'0'].first <= (mymap[texto[i]]*texto[i].length()-(mymap[texto[i]]*2)))
                    {
                        abrev[texto[i][0] - '0'].first = mymap[texto[i]]*texto[i].length()-(mymap[texto[i]]*2) ;
                        abrev[texto[i][0] - '0'].second = texto[i];
                    }
                }
                for (int i = 0 ; i < (int)texto.size(); ++i)
                {
                    if (abrev[texto[i][0] - '0'].second == texto[i])
                    {
                        cout<<texto[i][0]<<".";
                        sum ++;
                    }
                    else
                        cout<<texto[i];
                    if (i == (int)texto.size()-1)
                        cout << endl;
                    else
                        cout<< " ";
                }
                cout << sum << endl;
                for (int i = 49 ; i < 75; ++i)
                {
                    if (abrev[i].first != 0)
                    cout << (char)(i+'0')<< ". = " <<abrev[i].second<<endl;
                }
                texto.clear();
                limpaPair(abrev);
                palavra.clear();
    
                sum = 0;
                getline(cin,linha);
    
            }
            return 0;
        }
  • Muhamed Hamzic replied 5 years ago

    Hello,i was working on this problem for an hour now,and when i submitted it.It gives the error Runtime error.Here is my code i hope you guys/girls help me :)

    #include <iostream>
    #include <algorithm>
    #include <string>
    
    using namespace std;
    
        bool taken[26];
        int m;
        int o;
    int main()
    {
        pocetak:
               for(int i=0;i<=26;i++){
                taken[i]=false;
               }
                string buffer;
                getline(cin,buffer);
                string words[buffer.length()+100000];
                o = m = 0;
                for(int i = 0;i < buffer.length();i++){
                    words[i]=="";
                }
                for(int i = 0;i < buffer.length();i++){
                        if(buffer[i]==' ' && buffer[i+1]!=' '){
                            o++;
                        }
                        if(buffer[i]!=' '){
                            words[o]=words[o]+buffer[i];
                        }
                }
                string kopiranje[o+1];
                copy(words,words+o+1,kopiranje);
                for(int i = 0;i <= o;i++){
                    for(int j = 0;j <= o;j++){
                        if(words[ i ].length()>words[ j ].length()){
                            swap(words[ i ],words[ j ]);
                        }
                    }
                }
    
                string abbreviations[o];
                for(int i = 0;i <= o;i++){
                    string temp=words[ i ];
                    if(words[ i ].length()>2 && taken[(temp[ 0 ]-96)]==false){
                        taken[(temp[ 0 ]-96)]=true;
                        abbreviations[ m ]=words[ i ];
                        m=m+1;
                    }
                }
            for(int i = 0;i <=o;i++){
                    bool flag=false;
                    if(kopiranje[ i ].length()<=2){
                        cout<<kopiranje[ i ];
                        goto pp;
                    }
    
                    for(int j = 0;j <m;j++){
                        if(kopiranje[ i ]==abbreviations[ j ]){
                          string temp=abbreviations[ j ];
                          cout<<temp[ 0 ]<<".";
                            flag=true;
                        }
                    }
                    if(flag==false){
                        cout<<kopiranje[ i ];
                    }
                    pp: cout<<" ";
                }
                cout<<endl;
                cout<<m;
                cout<<endl;
                char first_letter[m];
                for(int i=0;i<m;i++){
                        string temp=abbreviations[ i ];
                    first_letter[ i ]=temp[ 0 ];
                }
                sort(first_letter,first_letter+m);
                string almost_final[m];
                for(int i = 0;i < m;i++){
                    for(int j=0;j<m;j++){
                        string temp=abbreviations[ i ];
                        if(first_letter[ j ]==temp[ 0 ]){
                           cout<<first_letter[ j ]<< "." << "="<<temp<<endl;
                             break;
                        }
                    }
                }
                for(int i=0;i<buffer.length();i++){
                    if(buffer[i]=='.'){
                        return 0;
                    }
                }
        goto pocetak;
    }
  • Claudivan Barreto replied 5 years ago

    Era isso mesmo. Obg.

  • Claudivan Barreto replied 5 years ago

    Estou recebendo W.A (10%), alguém sabe dizer o erro?

    Accepted
  • Roberto replied 6 years ago

    O último caso não necessariamente retorna

    ato ato a.

    No meu caso, ele retornou

    a. a. ator

    e foi aceito. O fato é que ambas possuem o mesmo número de caracteres. Portanto, talvez seja um caso que não exista na entrada.

    Abraços.

  • Miguel Mendes replied 6 years ago

    Descobri o meu erro. Acredito que tenha gente errando a mesma coisa, seguem os casos de teste que eu usei.

    Entrada:

    hoje eu visitei meus pais
    tive que lavar meu cachorro pois ele estava fedendo
    a casa que eu fiz era alta
    ele ele ele ensaiava
    ele ele ele ele ele estava
    ato ato ator
    .

    Saída:

    h. eu v. m. p.
    4
    h. = hoje
    m. = meus
    p. = pais
    v. = visitei
    t. q. l. m. c. p. ele e. f.
    8
    c. = cachorro
    e. = estava
    f. = fedendo
    l. = lavar
    m. = meu
    p. = pois
    q. = que
    t. = tive
    a c. q. eu f. e. a.
    5
    a. = alta
    c. = casa
    e. = era
    f. = fiz
    q. = que
    ele ele ele e.
    1
    e. = ensaiava
    e. e. e. e. e. estava
    1
    e. = ele
    ato ato a.
    1
    a. = ator
  • Lucas Steffen replied 6 years ago

    Posta teu código (comentado...). É a porcentagem de erros.

  • Eder replied 6 years ago

    Alguém tem mais alguns exemplos de entrada?

    Todas entradas que testei (do enunciado e mais estes que foram postados aqui no forum até agora) dão certo.

    Mas ao submeter retorna "Wrong answer (40%)". Deve ter algum caso mais específico para testar.

    Outra dúvida, quando obtenho "Wrong answer (40%)" e "Wrong answer (80%)" por exemplo, significa que o meu programa passou em 40% e 80% dos testes, respectivamentes OU significa que falta 40% e 80% dos testes para executar?

  • Matheus Leão replied 6 years ago

    Bom, pelo código que você postou parece que o problema é quando há mais de uma palavra começando com a mesma letra. Ao invés de abreviar uma e escrever a outra normal, você está ignorando a segunda palavra. Mesmo consertando isso você recebeu W.A.?

  • Hélio Duarte replied 6 years ago

    Continuo recebendo 10% de WA. :(

  • Matheus Leão replied 6 years ago

    Testa esse caso:

    ato ato ator
    .
  • Hélio Duarte replied 6 years ago

    To levando 10% de WA mas não sei porque.

    #include <bits/stdc++.h>
    using namespace std;
    map<char,string> t1;
    map<string,string> t2;
    map<string,int>t3;
    vector<string> name;
    bool marc[1000];
    void zerar(){
        t1.clear();
        t2.clear();
        t3.clear();
        name.clear();
        memset(marc,0,sizeof marc);
    }
    int main(){
        string j;
        while(true){    
            zerar();
            getline(cin,j);
            string nova = "";
            if(j[0] == '.')break;
            //separa as palavras da frase em varias palavras e coloca no vector
            for(int i = 0;i < j.size();i++){
                if(j[i] == ' '){
                    if(nova.size() > 0)
                        name.push_back(nova);
                    nova = "";
                }
                else nova+=j[i];
            }
            if(nova.size() > 0){
                name.push_back(nova);
            }
            for(int i = 0;i < name.size();i++){
                if(name[i].size() > 2){
                    t3[name[i]]++;
                }
                if(!marc[name[i][0]] && name[i].size() > 2){
                    marc[name[i][0]] = true;
                    t1[name[i][0]] = name[i];
                    t2[name[i]] = name[i][0];
    
                }
                else if(name[i].size() > 2 && name[i] == t1[name[i][0]]);
                else if(name[i].size() <= 2 )t2[name[i]] = name[i];
                else if(name[i].size() > 2 && name[i].size()*t3[name[i]] >= t1[name[i][0]].size()*t3[t1[name[i][0]]]){
                        t2[t1[name[i][0]]] = t1[name[i][0]];
                        t1[name[i][0]] = name[i];
                        t2[name[i]] = name[i][0];
    
                }
    
            }
            for(int i = 0;i < name.size();i++){
                    if(i < name.size() -1){
                        if(t2[name[i]].size() == 1 && name[i].size() > 1)
                            cout << t2[name[i]] << ". " ;
                        else 
                            cout << t2[name[i]] << " " ;
                    }
                    else{
                            if(t2[name[name.size()-1]].size() == 1 && name[name.size()-1].size() > 1)
                                cout << t2[name[i]] << "." << endl;
                            else 
                                cout << t2[name[i]] << endl;
                    }   
            }
            cout << t1.size() << endl;
            map<char,string> :: iterator it;
            for(it = t1.begin();it != t1.end();it++){
                cout << it->first << ". = "<< it->second << endl;
            }
        }
    }
  • Lucas Steffen replied 6 years ago

    Tenta esse:

    astralopitecus arara arara arara arara arara arara arara arara arara arara arara arara arara
    .
  • Hélio Duarte replied 6 years ago

    Alguém pode colocar exemplo de testes por favor ? Eu fiz o código e ta batendo com todos os testes que eu faço mas da 40% de WA.

  • Lucas Steffen replied 6 years ago

    ja descobri meu erro...

  • Matheus Leão replied 6 years ago

    Lucas, não temos acesso às submissões. Você poderia postar seu código para que a gente possa ver?

  • Lucas Steffen replied 6 years ago

    Tem como postar um caso de teste em que meu algoritmo falha? submissão: 966040 \0

1 of 2