Advertisement
coloriot

HA17_B

Jul 26th, 2024
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.00 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. // Задача B: Автодополнение на минималках
  4.  
  5. using namespace std;
  6.  
  7. class String {
  8. private:
  9.     char* data; // Указатель на данные
  10.     int length; // Длина строки
  11.  
  12. public:
  13.     // Конструктор по умолчанию
  14.     String() : data(nullptr), length(0) {}
  15.  
  16.     // Конструктор с параметрами
  17.     String(const char* str, int len) : length(len) {
  18.         data = new char[length];
  19.         for (int i = 0; i < length; i++) {
  20.             data[i] = str[i];
  21.         }
  22.     }
  23.  
  24.     // Конструктор копирования
  25.     String(const String& other) : length(other.length) {
  26.         data = new char[length];
  27.         for (int i = 0; i < length; i++) {
  28.             data[i] = other.data[i];
  29.         }
  30.     }
  31.  
  32.     // Деструктор
  33.     ~String() {
  34.         delete[] data;
  35.     }
  36.  
  37.     // Оператор =
  38.     String& operator=(const String& other) {
  39.         if (this == &other) return *this; // Более изящный вариант сравнения
  40.         delete[] data;
  41.         length = other.length;
  42.         data = new char[length];
  43.         for (int i = 0; i < length; i++) {
  44.             data[i] = other.data[i];
  45.         }
  46.         return *this;
  47.     }
  48.  
  49.     // Проверяем префикс
  50.     bool startsWith(const String& prefix) const {
  51.         if (prefix.length > length) return false;
  52.         for (int i = 0; i < prefix.length; i++) {
  53.             if (data[i] != prefix.data[i]) return false;
  54.         }
  55.         return true;
  56.     }
  57.  
  58.     // Сравниваем
  59.     bool operator<(const String& other) const {
  60.         int minLength = length < other.length ? length : other.length;
  61.         for (int i = 0; i < minLength; i++) {
  62.             if (data[i] < other.data[i]) return true;
  63.             if (data[i] > other.data[i]) return false;
  64.         }
  65.         return length < other.length;
  66.     }
  67.  
  68.     // Оператор ==
  69.     bool operator==(const String& other) const {
  70.         if (length != other.length) return false;
  71.         for (int i = 0; i < length; i++) {
  72.             if (data[i] != other.data[i]) return false;
  73.         }
  74.         return true;
  75.     }
  76.  
  77.     // Длина строки
  78.     int size() const {
  79.         return length;
  80.     }
  81.  
  82.     // Оператор индекса
  83.     char operator[](int index) const {
  84.         return data[index];
  85.     }
  86.  
  87.     // Оператор ввода
  88.     friend istream& operator>>(istream& is, String& str) {
  89.         string buffer;
  90.         is >> buffer;
  91.         str = String(buffer.data(), buffer.size());
  92.         return is;
  93.     }
  94.  
  95.     // Оператор вывода
  96.     friend ostream& operator<<(ostream& os, const String& str) {
  97.         for (int i = 0; i < str.length; i++) {
  98.             os << str.data[i];
  99.         }
  100.         return os;
  101.     }
  102. };
  103.  
  104. int main() {
  105.  
  106.     int N, Q;
  107.     cin >> N >> Q; // Ввод количества слов и запросов
  108.  
  109.     String* dictionary = new String[N]; // Массив для словаря
  110.     for (int i = 0; i < N; ++i) {
  111.         cin >> dictionary[i];
  112.     }
  113.  
  114.     int* results = new int[Q]; // Массив для результатов
  115.     int resultIndex = 0; // Индекс для результатов
  116.  
  117.     for (int i = 0; i < Q; ++i) {
  118.         String prefix;
  119.         int k;
  120.         cin >> k >> prefix; // Ввод запроса
  121.  
  122.         int count = 0;
  123.         results[i] = -1; // Инициализация результата значением -1
  124.         for (int j = 0; j < N; ++j) {
  125.             if (dictionary[j].startsWith(prefix)) {
  126.                 count++;
  127.                 if (count == k) {
  128.                     results[i] = j + 1; // Индекс 1-based
  129.                     break;
  130.                 }
  131.             }
  132.         }
  133.     }
  134.  
  135.     for (int i = 0; i < Q; ++i) {
  136.         cout << results[i] << '\n'; // Вывод результатов по строкам
  137.     }
  138.  
  139.     delete[] dictionary;
  140.     delete[] results;
  141.  
  142.     return 0;
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement