Привет, CodeForces!
Основная информация
Я написал генератор тестов на C++. Он очень прост, состоит из двух функций: генерация случайного числа в промежутке от $$$a$$$ до $$$b$$$, так, чтобы это случайное число было кратно $$$k$$$ (функция: genint(a, b, k, add)
, где add
— "добавлять" ли в тест это число) и генерация случайной строки. Тут надо расписать:
- Генерирует строку случайной длины в промежутке от $$$a$$$ до $$$b$$$, так, чтобы она была кратна $$$k$$$.
- Состоящую из заданных символов. Задавать символы можно двумя способами: написать промежуток
("a-f", "x-z")
или конкретный символ("m", "o")
. Функция:genstr(a, b, k, pattern, add)
, гдеpattern
— массив заданных промежутков или конкретных символов.
Применения
Есть такая задача: Вам дана строка состоящая из $$$n (n \le 10^5)$$$ символов. Вам требуется процент содержания (с точностью до $$$10^{-5}$$$) каждого символа, который есть в строке. Пример ввода и вывода:
Вам требуется обработать $$$t$$$ наборов входных данных
Для нас, участников соревнования, эта задача очень проста, но для составителей надо написать такие тесты, в которых будут и крайние и обычные случаи. Писать это вручную — плохой вариант. Тем более, что $$$n \le 10^5$$$
С помощью моего генератора можно сделать хорошие тесты в несколько строк:
const int mintestcases = 5;
const int maxtestcases = 8;
const int minlength = 10;
const int maxlength = 20;
for (int i = 0; i < 5; i++) { // генерирует 5 тестов
string test = "";
int t = genint(mintestcases, maxtestcases, 1, true);
test += '\n';
for (int j = 0; j < t; j++) {
int n = genint(minlength, maxlength, 5, true);
test += '\n';
genstr(n, n, 1, {"a-z"}, true);
test += '\n';
}
}
Чтобы сделать большие тесты надо увеличить значения mintestcases
, maxtestcases
, minlength
, maxlength