- 制限時間が緩いので全探索を定数レベルで高速化すれば通る
bool compareByConditions(const string& lh, const string& rh) {
return lh.size() != rh.size() ? lh.size() > rh.size() : lh > rh;
}
string toString(int value, int length) {
char buffer[1024];
for (int i = 0; i < length; ++i) {
buffer[i] = (value & 1) + '0';
value >>= 1;
}
buffer[length] = '\0';
reverse(buffer, buffer + length);
return buffer;
}
static char buffer[1024 * 1024 * 3];
int main() {
int A, B, N;
scanf("%d%d%d%s", &A, &B, &N, buffer);
int length = strlen(buffer);
while (buffer[length - 1] != '2') {
buffer[--length] = '\0';
}
buffer[--length] = '\0';
hash_map<int, int> counter;
for (int len = A; len <= B; ++len) {
int index = 0;
int value = 0;
while (index < len - 1 && index < length) {
value <<= 1;
value |= (buffer[index++] - '0');
}
while (index < length) {
value <<= 1;
value |= (buffer[index++] - '0');
value &= (1 << len) - 1;
++counter[value | (len << 16)];
}
}
map<int, vector<string> > answer;
for (hash_map<int, int>::iterator it = counter.begin(), itEnd = counter.end(); it != itEnd; ++it) {
const int length = (it->first >> 16);
const int value = (it->first & ((1 << 16) - 1));
answer[it->second].push_back(toString(value, length));
}
int n = 0;
for (map<int, vector<string> >::reverse_iterator rit = answer.rbegin(); rit != answer.rend() && n < N; ++rit, ++n) {
sort(rit->second.begin(), rit->second.end(), compareByConditions);
cout << rit->first;
for (vector<string>::iterator it = rit->second.begin(), itEnd = rit->second.end(); it != itEnd; ++it) {
cout << " " << *it;
}
cout << endl;
}
}