Матч 44, Младший брат (YoungBrother)

 

Джон набрал текст в текстовом редакторе. Текст состоит из n строк, каждая строка содержит в точности k символов. Его младший брат в некоторых местах вставил символы разрыва строки, а также уничтожил некоторые уже существующие символы разрыва строки. К счастью, ни один другой символ удален не был. Помогите Джону восстановить исходный текст.

 

Класс: YoungBrother

Метод: vector<string> restoreWords(vector<string> lines,

                                   int n, int k)

Ограничения: lines содержит от 1 до 50 элементов, lines[i] содержит от 0 до 50 символов ‘a’ – ‘z’, 1 £ n £ 50, 0 £ k £ 50, lines содержит в точности n * k символов.

 

Вход. Массив строк lines, задающий текст, и два целых числа n и k.

 

Выход. Восстановленный исходный текст Джона.

 

Пример входа

lines

n

k

{"jhgu", "", "a", "kjl"}

2

4

{"","",""}

1

0

{"tkwyslbgxegjvdaafcnxhetx","xwuqmvepmkxl"}

6

6

 

Пример выхода

{"jhgu", "akjl"}

{""}

{"tkwysl", "bgxegj", "vdaafc", "nxhetx", "xwuqmv", "epmkxl"}

 

 

РЕШЕНИЕ

обработка текста

 

Объединим все строки массива lines в одну строку all, используя функцию accumulate. Далее разобьем строку all на подстроки по k символов. i - ая подстрока начинается с i*k - го символа строки all и имеет длину k.

 

ПРОГРАММА

 

#include <cstdio>

#include <string>

#include <vector>

#include <numeric>

using namespace std;

 

class YoungBrother

{

public:

  vector<string> restoreWords(vector<string> lines, int n, int k)

  {

    vector<string> res;

    string all = accumulate(lines.begin(),lines.end(),string());

    for(int i = 0; i < n; i++)

      res.push_back(all.substr(i * k,k));

    return res;

  }

};