fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4.  
  5.  
  6. struct person //struktura pomocnicza
  7. { //laczy imie i ilosc wystapienia tego imienia
  8. person(std::string str) { name = str;}
  9. std::string name;
  10. int count=1;
  11. };
  12.  
  13.  
  14. void quicksort(std::vector<struct person>& arr, int left, int right) //algorytm sortujacy quicksort
  15. { //przerobiony do sortowania struktur
  16. person per("");
  17. per = arr[(left + right) / 2];
  18. int i, j;
  19. i = left;
  20. j = right;
  21. do {
  22. while (arr[i].count>per.count) i++;
  23. while (arr[j].count<per.count) j--;
  24. if (i <= j) {
  25. std::swap(arr[i], arr[j]);
  26. i++; j--;
  27. }
  28. } while (i <= j);
  29. if (j>left) quicksort(arr, left, j);
  30. if (i<right) quicksort(arr, i, right);
  31. }
  32.  
  33.  
  34. ////////////////////////////////////////////////////MAIN////////////////////////////////////////////
  35.  
  36. int main()
  37. {
  38. std::string str;
  39. int end = 0;
  40. person s(""); //pomocnicza struktura
  41.  
  42. std::vector <struct person> per; //vector na struktury
  43. per.reserve(100000);
  44.  
  45.  
  46. ////////////////////////WPROWADZANIE DANYCH/////////////////////////////
  47.  
  48. while (std::cin >> str >> str >> str) //w celu uproszczenia kodu postanowilem olac
  49. { //caly input przed druga spacja
  50. s.name = str;
  51. for (int ii = s.name.size() - 1; ii >= 0; ii--) //poprawiam wszystkie male litery na duze
  52. {
  53. s.name[ii]=toupper(s.name[ii]);
  54. }
  55.  
  56. for (int i = 0; i < per.size(); i++) //jesli imie pojawia sie pierwszy raz to dodaje
  57. { //do vectora, w innym wypadku liczy powtorzenie
  58. if (per[i].name == s.name) { per[i].count++; end = 1; }
  59. }
  60. if (end != 1)
  61. {
  62. per.push_back(s);
  63. }
  64. end = 0;
  65. }
  66.  
  67.  
  68.  
  69. ////////////////////////////SORTOWANIE IMION///////////////////////////////////////
  70.  
  71. quicksort(per, 0, per.size() - 1); //quicksort sortuje struktury wedlug ilosci powtorzen
  72.  
  73. for (int i = 0; i < per.size(); i++)
  74. {
  75. for (int ii = 0; ii < per.size() - 1; ii++) //jesli imiona wystapily tyle samo razy
  76. { //to sortuje je alfabetycznie algorytmem
  77. if (per[ii].count == per[ii + 1].count) //babelkowym
  78. {
  79. for (int j = 0; j < per[ii].name.size(); j++)
  80. {
  81. if (per[ii].name[j] < per[ii + 1].name[j]) { break; }
  82. else if (per[ii].name[j] > per[ii + 1].name[j])
  83. {
  84. std::swap(per[ii], per[ii + 1]);
  85. break;
  86. }
  87. }
  88. }
  89. }
  90. std::cout << per[i].name << " " << per[i].count << std::endl; //wypisuje imiona i ilosc powtorzen
  91. }
  92.  
  93. return 0;
  94. }
Success #stdin #stdout 0s 16072KB
stdin
1. KowalSki JaCEk
2. mazurkiewicz pIoTR
3. prokoP ANna
4. MisioL annA
5. BerezOwSki jaCEK
6. pietraS ANNA
7. WILkowsKA aneta
stdout
ANNA 3
JACEK 2
ANETA 1
PIOTR 1