#include // std::cout, cin #include // std::sort #include // std::vector #include // printf(), scanf() #include // stringstream // porovnávací funkce pro sort z C++, vyhodnotí výraz i>j a vrátí true/false bool porovnani (int i,int j) { return (i>j); } using namespace std; int main() { // vstup // načteme vstup do dynamicky alokovaného pole int N = 0; scanf("%i",&N); int * hrnce = new int[N]; for(int i = 0; i < N; i++) { scanf("%i",&hrnce[i]); } // vytvoříme si vector, přidáme do něj prvky a poté je seřadíme vector v_hrncu (hrnce, hrnce+N); sort(v_hrncu.begin(), v_hrncu.end(), porovnani); // první prvek "vidíme teď" // počet hromádek je tedy 1 (potřebujeme alespoň jednu) // proměnná za sebou indikuje, kolik stejných hrnců jsme již viděli "zasebou" int hromadky = 1; int zasebou = 1; int predchozi = *v_hrncu.begin(); // procházíme vector od druhého prvku do konce // pokud je i-tý hrnec stejný jako "předchozí" tak // přičteme k "zasebou" a porovnáme s počtem hromádek // pokud je hrnců za sebou více než hromádek, potřebujeme další hromádku for (vector::iterator it=v_hrncu.begin()+1; it!=v_hrncu.end(); ++it) { if(predchozi == *it) { zasebou++; if (zasebou > hromadky) { hromadky++; } } else { zasebou = 1; predchozi = *it; } } // další pruchod, zavedeme si pole stringů // a budeme přidávat číslo do stringu a tím tvořit hledané posloupnosti // hrnce, které se vyskytují v posloupnosti pouze jednou dáváme defaultně do 0 // hrnce, které jsou více než jednou dáme do 0 // a poté do tolika následujících, kolik je potřeba string * hromady = new string[hromadky]; zasebou = 1; predchozi = *v_hrncu.begin(); // přidáme první prvek do 0 a poté začneme od druhého prvku stringstream ss; ss << predchozi ; hromady[0] = ss.str() + " "; // pokud prvek vidíme už po i-té, tak ho dáme do i-tého stringu (hromady[i]) // pokud poprvé, přidáme ho do nultého stringu (hromady[0]) for (vector::iterator it=v_hrncu.begin()+1; it!=v_hrncu.end(); ++it) { stringstream ss; ss << *it; if(predchozi == *it) { hromady[zasebou] = hromady[zasebou] + ss.str() + " " ; zasebou++; } else { hromady[0] = hromady[0] + ss.str() + " "; zasebou = 1; predchozi = *it; } } // výstup // vypíšeme všechny stringy, které jsme vytvořili printf("%i\n",hromadky); for(int i = 0; i < hromadky; i++) { cout << hromady[i] << endl; } return 0; }