#include <bits/stdc++.h>
using namespace std;
struct Node {
string val;
int count;
};
void burstArrayLinear(vector<string>& arr, int k) {
if (k <= 1) {
arr.clear();
return;
}
stack<Node> s;
for (const string& str : arr) {
// If current matches the top of stack, increase its count
if (!s.empty() && s.top().val == str) {
s.top().count++;
} else {
// Before pushing a new char, check if the current top should burst
if (!s.empty() && s.top().count >= k) {
s.pop();
// After popping, the NEW top might match the current string
if (!s.empty() && s.top().val == str) {
s.top().count++;
} else {
s.push({str, 1});
}
} else {
s.push({str, 1});
}
}
}
// Final check for the last remaining element in stack
if (!s.empty() && s.top().count >= k) {
s.pop();
}
// Reconstruct the array from stack
vector<string> result;
vector<Node> temp;
while (!s.empty()) {
temp.push_back(s.top());
s.pop();
}
// Reverse to get correct order and expand counts
for (int i = temp.size() - 1; i >= 0; i--) {
for (int j = 0; j < temp[i].count; j++) {
result.push_back(temp[i].val);
}
}
arr = result;
}
int main() {
int n, k;
cin >> n;
vector<string> input(n);
for (int i = 0; i < n; i++) cin >> input[i];
cin >> k;
burstArrayLinear(input, k);
for (const string& s : input) cout << s << endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgTm9kZSB7CiAgICBzdHJpbmcgdmFsOwogICAgaW50IGNvdW50Owp9OwoKdm9pZCBidXJzdEFycmF5TGluZWFyKHZlY3RvcjxzdHJpbmc+JiBhcnIsIGludCBrKSB7CiAgICBpZiAoayA8PSAxKSB7CiAgICAgICAgYXJyLmNsZWFyKCk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHN0YWNrPE5vZGU+IHM7CgogICAgZm9yIChjb25zdCBzdHJpbmcmIHN0ciA6IGFycikgewogICAgICAgIC8vIElmIGN1cnJlbnQgbWF0Y2hlcyB0aGUgdG9wIG9mIHN0YWNrLCBpbmNyZWFzZSBpdHMgY291bnQKICAgICAgICBpZiAoIXMuZW1wdHkoKSAmJiBzLnRvcCgpLnZhbCA9PSBzdHIpIHsKICAgICAgICAgICAgcy50b3AoKS5jb3VudCsrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEJlZm9yZSBwdXNoaW5nIGEgbmV3IGNoYXIsIGNoZWNrIGlmIHRoZSBjdXJyZW50IHRvcCBzaG91bGQgYnVyc3QKICAgICAgICAgICAgaWYgKCFzLmVtcHR5KCkgJiYgcy50b3AoKS5jb3VudCA+PSBrKSB7CiAgICAgICAgICAgICAgICBzLnBvcCgpOwogICAgICAgICAgICAgICAgLy8gQWZ0ZXIgcG9wcGluZywgdGhlIE5FVyB0b3AgbWlnaHQgbWF0Y2ggdGhlIGN1cnJlbnQgc3RyaW5nCiAgICAgICAgICAgICAgICBpZiAoIXMuZW1wdHkoKSAmJiBzLnRvcCgpLnZhbCA9PSBzdHIpIHsKICAgICAgICAgICAgICAgICAgICBzLnRvcCgpLmNvdW50Kys7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHMucHVzaCh7c3RyLCAxfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzLnB1c2goe3N0ciwgMX0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8vIEZpbmFsIGNoZWNrIGZvciB0aGUgbGFzdCByZW1haW5pbmcgZWxlbWVudCBpbiBzdGFjawogICAgaWYgKCFzLmVtcHR5KCkgJiYgcy50b3AoKS5jb3VudCA+PSBrKSB7CiAgICAgICAgcy5wb3AoKTsKICAgIH0KCiAgICAvLyBSZWNvbnN0cnVjdCB0aGUgYXJyYXkgZnJvbSBzdGFjawogICAgdmVjdG9yPHN0cmluZz4gcmVzdWx0OwogICAgdmVjdG9yPE5vZGU+IHRlbXA7CiAgICB3aGlsZSAoIXMuZW1wdHkoKSkgewogICAgICAgIHRlbXAucHVzaF9iYWNrKHMudG9wKCkpOwogICAgICAgIHMucG9wKCk7CiAgICB9CiAgICAKICAgIC8vIFJldmVyc2UgdG8gZ2V0IGNvcnJlY3Qgb3JkZXIgYW5kIGV4cGFuZCBjb3VudHMKICAgIGZvciAoaW50IGkgPSB0ZW1wLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0ZW1wW2ldLmNvdW50OyBqKyspIHsKICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayh0ZW1wW2ldLnZhbCk7CiAgICAgICAgfQogICAgfQogICAgYXJyID0gcmVzdWx0Owp9CgppbnQgbWFpbigpIHsKICAgIGludCBuLCBrOwogICAgY2luID4+IG47CiAgICB2ZWN0b3I8c3RyaW5nPiBpbnB1dChuKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSBjaW4gPj4gaW5wdXRbaV07CiAgICBjaW4gPj4gazsKCiAgICBidXJzdEFycmF5TGluZWFyKGlucHV0LCBrKTsKCiAgICBmb3IgKGNvbnN0IHN0cmluZyYgcyA6IGlucHV0KSBjb3V0IDw8IHMgPDwgZW5kbDsKCiAgICByZXR1cm4gMDsKfQ==