Матч 313, Безпрефиксные деревья (PrefixFreeSets)

Дивизион 2, Уровень 2; Дивизион 1, Уровень 1

 

Для заданного набора слов необходимо найти такое его максимальное подмножество, для которого ни одно слово не является префиксом другого. Для входного набора слов вывести мощность такого максимального подмножества.

 

Класс: PrefixFreeSets

Метод: int maxElements(vector<string> words)

Ограничения: words содержит от 1 до 50 строк, каждая строка содержит от 1 до 50 символов ‘a’-‘z’.

 

Вход. Массив строк words.

 

Выход. Мощность максимального подмножества  words, в котором ни одно слово не является префиксом другого.

 

Пример входа

words

{"hello","hi","h","run","rerun","running"}

{"a","b","cba","cbc","cbb","ccc”}

{"a","ab","abc","abcd","abcde","abcdef"}

 

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

4

6

1

 

 

 

РЕШЕНИЕ

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

 

Необходимо перебрать все пары строк (words[i], words[j]), 0 £ i, j < words.size(), и если для некоторой пары words[i] будет префиксом words[j], то из списка слов следует удалить words[i]. Оставшееся множество слов в массиве words и будет искомым максимальным подмножеством. Возвращаем его размер.

 

ПРОГРАММА

 

#include <cstdio>

#include <string>

#include <vector>

using namespace std;

 

class PrefixFreeSets{

public:

 

  int maxElements(vector<string> words)

  {

    int i,j,flag;

    for(i=0;i<words.size();)

    {

      flag = 0;

      for(j=0;j<words.size();j++)

      {

        if (i == j) continue;

        if (words[j].find(words[i]) == 0)

        {

          words.erase(words.begin()+i);

          flag = 1; break;

        }

      }

      if (!flag) i++;

    }

    return words.size();

  }

};