#include<iostream> #include<string> using namespace std; int ciagi_l = 0; int partition(string tablica[], int p, int r) // dzielimy tablice na dwie czesci, w pierwszej wszystkie liczby sa mniejsze badz rowne x, w drugiej wieksze lub rowne od x { int x = tablica[p].length(); // obieramy x int i = p, j = r;// i, j - indeksy w tabeli string w; while (true) // petla nieskonczona - wychodzimy z niej tylko przez return j { while (tablica[j].length() > x) // dopoki elementy sa wieksze od x j--; while (tablica[i].length() < x) // dopoki elementy sa mniejsze od x i++; if (i < j) // zamieniamy miejscami gdy i < j { w = tablica[i]; tablica[i] = tablica[j]; tablica[j] = w; i++; j--; } else // gdy i >= j zwracamy j jako punkt podzialu tablicy return j; } } void quicksort(string tablica[], int p, int r) // sortowanie szybkie { int q; if (p < r) { q = partition(tablica, p, r); // dzielimy tablice na dwie czesci; q oznacza punkt podzialu quicksort(tablica, p, q); // wywolujemy rekurencyjnie quicksort dla pierwszej czesci tablicy quicksort(tablica, q + 1, r); // wywolujemy rekurencyjnie quicksort dla drugiej czesci tablicy } } int main() { int m, n, k; cin >> m; cin >> n; cin >> k; string * ciagi = new string[n * n * k]; for (int i = 0; i < n; i++) { char x, y; cin >> x; cin >> y; for (int j = 0; j < n; j++) { if (ciagi[j].empty()) { ciagi_l++; ciagi[j] += x; ciagi[j] += y; break; } else if (ciagi[j][0] == y) { ciagi[j] = x + ciagi[j]; } else if (ciagi[j][ciagi[j].length() - 1] == x) { ciagi[j] += y; } } } quicksort(ciagi, 0, ciagi_l - 1); for (int i = 0; i < k; i++) { char wybraniec = ciagi[ciagi_l - 1][(ciagi[ciagi_l - 1].length()) / 2]; int tmp = ciagi_l; for (int j = 0; j < tmp; j++) { size_t t = -3; if (ciagi[j].find(wybraniec)) { t = ciagi[j].find(wybraniec); } if (t != -3) { string tmp = ciagi[j]; ciagi[j].erase(0, (t + 1)); tmp.erase(t, tmp.length()); ciagi[ciagi_l] = tmp; ciagi_l++; } } quicksort(ciagi, 0, ciagi_l - 1); } cout << ciagi[ciagi_l - 1].length(); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | #include<iostream> #include<string> using namespace std; int ciagi_l = 0; int partition(string tablica[], int p, int r) // dzielimy tablice na dwie czesci, w pierwszej wszystkie liczby sa mniejsze badz rowne x, w drugiej wieksze lub rowne od x { int x = tablica[p].length(); // obieramy x int i = p, j = r;// i, j - indeksy w tabeli string w; while (true) // petla nieskonczona - wychodzimy z niej tylko przez return j { while (tablica[j].length() > x) // dopoki elementy sa wieksze od x j--; while (tablica[i].length() < x) // dopoki elementy sa mniejsze od x i++; if (i < j) // zamieniamy miejscami gdy i < j { w = tablica[i]; tablica[i] = tablica[j]; tablica[j] = w; i++; j--; } else // gdy i >= j zwracamy j jako punkt podzialu tablicy return j; } } void quicksort(string tablica[], int p, int r) // sortowanie szybkie { int q; if (p < r) { q = partition(tablica, p, r); // dzielimy tablice na dwie czesci; q oznacza punkt podzialu quicksort(tablica, p, q); // wywolujemy rekurencyjnie quicksort dla pierwszej czesci tablicy quicksort(tablica, q + 1, r); // wywolujemy rekurencyjnie quicksort dla drugiej czesci tablicy } } int main() { int m, n, k; cin >> m; cin >> n; cin >> k; string * ciagi = new string[n * n * k]; for (int i = 0; i < n; i++) { char x, y; cin >> x; cin >> y; for (int j = 0; j < n; j++) { if (ciagi[j].empty()) { ciagi_l++; ciagi[j] += x; ciagi[j] += y; break; } else if (ciagi[j][0] == y) { ciagi[j] = x + ciagi[j]; } else if (ciagi[j][ciagi[j].length() - 1] == x) { ciagi[j] += y; } } } quicksort(ciagi, 0, ciagi_l - 1); for (int i = 0; i < k; i++) { char wybraniec = ciagi[ciagi_l - 1][(ciagi[ciagi_l - 1].length()) / 2]; int tmp = ciagi_l; for (int j = 0; j < tmp; j++) { size_t t = -3; if (ciagi[j].find(wybraniec)) { t = ciagi[j].find(wybraniec); } if (t != -3) { string tmp = ciagi[j]; ciagi[j].erase(0, (t + 1)); tmp.erase(t, tmp.length()); ciagi[ciagi_l] = tmp; ciagi_l++; } } quicksort(ciagi, 0, ciagi_l - 1); } cout << ciagi[ciagi_l - 1].length(); return 0; } |