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;
}