Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- // Задача B: Автодополнение на минималках
- using namespace std;
- class String {
- private:
- char* data; // Указатель на данные
- int length; // Длина строки
- public:
- // Конструктор по умолчанию
- String() : data(nullptr), length(0) {}
- // Конструктор с параметрами
- String(const char* str, int len) : length(len) {
- data = new char[length];
- for (int i = 0; i < length; i++) {
- data[i] = str[i];
- }
- }
- // Конструктор копирования
- String(const String& other) : length(other.length) {
- data = new char[length];
- for (int i = 0; i < length; i++) {
- data[i] = other.data[i];
- }
- }
- // Деструктор
- ~String() {
- delete[] data;
- }
- // Оператор =
- String& operator=(const String& other) {
- if (this == &other) return *this; // Более изящный вариант сравнения
- delete[] data;
- length = other.length;
- data = new char[length];
- for (int i = 0; i < length; i++) {
- data[i] = other.data[i];
- }
- return *this;
- }
- // Проверяем префикс
- bool startsWith(const String& prefix) const {
- if (prefix.length > length) return false;
- for (int i = 0; i < prefix.length; i++) {
- if (data[i] != prefix.data[i]) return false;
- }
- return true;
- }
- // Сравниваем
- bool operator<(const String& other) const {
- int minLength = length < other.length ? length : other.length;
- for (int i = 0; i < minLength; i++) {
- if (data[i] < other.data[i]) return true;
- if (data[i] > other.data[i]) return false;
- }
- return length < other.length;
- }
- // Оператор ==
- bool operator==(const String& other) const {
- if (length != other.length) return false;
- for (int i = 0; i < length; i++) {
- if (data[i] != other.data[i]) return false;
- }
- return true;
- }
- // Длина строки
- int size() const {
- return length;
- }
- // Оператор индекса
- char operator[](int index) const {
- return data[index];
- }
- // Оператор ввода
- friend istream& operator>>(istream& is, String& str) {
- string buffer;
- is >> buffer;
- str = String(buffer.data(), buffer.size());
- return is;
- }
- // Оператор вывода
- friend ostream& operator<<(ostream& os, const String& str) {
- for (int i = 0; i < str.length; i++) {
- os << str.data[i];
- }
- return os;
- }
- };
- int main() {
- int N, Q;
- cin >> N >> Q; // Ввод количества слов и запросов
- String* dictionary = new String[N]; // Массив для словаря
- for (int i = 0; i < N; ++i) {
- cin >> dictionary[i];
- }
- int* results = new int[Q]; // Массив для результатов
- int resultIndex = 0; // Индекс для результатов
- for (int i = 0; i < Q; ++i) {
- String prefix;
- int k;
- cin >> k >> prefix; // Ввод запроса
- int count = 0;
- results[i] = -1; // Инициализация результата значением -1
- for (int j = 0; j < N; ++j) {
- if (dictionary[j].startsWith(prefix)) {
- count++;
- if (count == k) {
- results[i] = j + 1; // Индекс 1-based
- break;
- }
- }
- }
- }
- for (int i = 0; i < Q; ++i) {
- cout << results[i] << '\n'; // Вывод результатов по строкам
- }
- delete[] dictionary;
- delete[] results;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement