TOPIC
PROBLEM 1519 - URI Fórum 1.0
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.
-
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; }
-
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
-
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
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.
-
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