Advertisement
xxeell

StringUpdater

May 14th, 2019
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.13 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. int magick_find(string s, int start)
  8. {
  9.     // Волшебная, сука, мать ее, функция поиска разделителей
  10.     // Все возможные разделители слов
  11.     int length = 9;
  12.     // количество ебаных вариантов
  13.     char* separator = new char[length];
  14.     // Само это говно
  15.     separator[0] = ' ';
  16.     separator[1] = '.';
  17.     separator[2] = ',';
  18.     separator[3] = '\'';
  19.     separator[4] = '\"';
  20.     separator[5] = '!';
  21.     separator[6] = '?';
  22.     separator[7] = ':';
  23.     separator[8] = ';';
  24.     // ---
  25.     int* index = new int[length];
  26.     int min_index = -1;
  27.     for (int i = 0; i < length; i++)
  28.     {
  29.         // Искаем первое вхождение для каждого разделителя
  30.         index[i] = s.find_first_of(separator[i], start);
  31.         if (index[i] > index[min_index]) min_index = i;
  32.     }
  33.  
  34.     for (int i = 0; i < length; i++)
  35.     {      
  36.         // Выбираем неотрицательный минимальный из них
  37.         // (ибо если нету, то -1)
  38.         if (index[i] >= 0 && index[i] < index[min_index]) min_index = i;
  39.     }
  40.     // Сохраняем себе индекс
  41.     int res = index[min_index];
  42.     // Очищаем поюзанную память
  43.     delete[] separator;
  44.     delete[] index;
  45.     // Возвращаем занчение
  46.     return res;
  47. }
  48.  
  49. string* split_string(string s, int& array_length, char* &sep_array)
  50. {
  51.     // Функция, разбивающая строку на массив слов
  52.     array_length = 1;
  53.     for (int i = magick_find(s, 0); i >= 0; i = magick_find(s, i + 1))
  54.     {
  55.         // рассчетс количества элементов как количество пробелов + 1
  56.         array_length++;
  57.     }
  58.  
  59.     int i1 = 0, i2;
  60.     // Массив слов
  61.     string* res = new string[array_length];
  62.     // Массив разделителей
  63.     sep_array = new char[array_length - 1];
  64.  
  65.     for (int i = 0; i < array_length; i++)
  66.     {
  67.         // Заполняем массив словами
  68.         i2 = magick_find(s, i1);
  69.         // Если разделитель принадлежит строке, то выписываем его отдельно
  70.         if(i2 < s.length()) sep_array[i] = s[i2];
  71.         // Выделяем подстроку длины i2 - i1 начиная с индекса i1
  72.         res[i] = s.substr(i1, i2 - i1);
  73.         i1 = i2 + 1;
  74.     }
  75.  
  76.     return res;
  77. }
  78.  
  79. int main()
  80. {
  81.     //ifstream in("input.txt");
  82.     //ofstream out("output.txt");
  83.  
  84.     string s;
  85.     getline(cin, s);
  86.     //Считываем строку
  87.  
  88.     int l;
  89.     char* sep;
  90.     string* as = split_string(s, l, sep);
  91.     // Разбиваем строку на массив слов
  92.     s.clear();
  93.     // Убираем все из строки
  94.  
  95.     for (int i = 0; i < l / 2; i++)
  96.     {
  97.         // делаем необходимые махинации
  98.         swap(as[i], as[l - i - 1]);
  99.     }
  100.  
  101.     // снова собираем строку
  102.     s.append(as[0]);
  103.     for (int i = 1; i < l; i++)
  104.     {
  105.         // вставляя нужные разделители между слов
  106.         s.append(1, sep[i - 1]);
  107.         s.append(as[i]);
  108.     }
  109.  
  110.     // выводим ее
  111.     cout << s;
  112.  
  113.     return 0;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement