Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите найти ошибку в тесте на последовательности бит C++

Alecs Doronin Ученик (117), закрыт 1 год назад
ARR - это массив из length символов , состоящий из 0 и 1, я сделал так чтобы считались серии последовательности , для условия нужно чтобы последовательность была по сторонам окружена другими символами , например 010 - тут в 1 серии 1 бит подошел условию и мы записали в счетчик , например для подсчета количества последовательности второй серии подойдет 01100, и так далее 011100 - 0111100 , то есть есть 12 счетчиков , 6 это шесть серий от 1 до 6+ ( когда последняя серия она считается от 6 и более) это для 1 , и еще 6 уже для символа 0 .Подскажите пожалуйста , как то можно оптимизировать мои условия? И там еще есть мелкая ошибка , которую я найти не могу ( буду признателен
https://onlinegdb.com/b3op2c8xG
Лучший ответ
Реципиент Гений (70409) 1 год назад
В коде присутствует адресация за пределами массива (по j).

Если ваша задача - считать последовательности вида 01{1}0 (по БНФ фигурные скобки - это неограниченное кол-во повторений, начиная от 0), то надо именно её и решать. Нужно реализовать нормальный лексический анализ и простенький синтаксический разбор, а не эти страдания. В своё время мне попадался шикарный лексический сканер на регулярных выражениях; его преимущество - в наглядности описаний. Хотя, для вашей задачи это, наверное, будет слишком тяжеловесно.

Опишу алгоритм в общих словах:
  1. Лексический анализ. Идёте по строке и находите лексемы. В случае, если надо искать 01{1}0 лексемами будут отдельный ноль и последовательность единиц любой длины. Выход алгоритма - последовательность лексем.
  2. Синтаксический разбор. Идёте по последовательности лексем и обновляете состояние и свои счётчики. Состояния: (1) "вне последовательности", (2) "начало последовательности", (3) "внутри последовательности". Начальное состояние (1). Обрабатываем лексемы по порядку в зависимости от состояния. Ноль в состоянии (1) - перевести в (2). Ноль в состоянии (2) - ничего не менять. Ноль в состоянии (3) - перевести в (1) и обновить счётчик по длине серии. Серия единиц в состоянии (1) - игнорировать. Серия единиц в состоянии (2) - перевести в (3) и сохранить длину серии. Серия единиц в состоянии (3) - игнорировать.
  3. Вывод результатов.

Всё делается на простейших конечных автоматах.
Остальные ответы
Николай Веселуха Высший разум (360666) 1 год назад
Два правила естественного отбора при решении сложных задач.

1. Если существуют несколько равноценных задач, то при выборе предпочтение следует отдать наиболее понятно сформулированной задаче.

2. Если имеется возможность отказаться от решения плохо сформулированной задачи, то от её решения следует немедленно отказаться.
Похожие вопросы