
a&b&c
Объяснение:
Очень просто это "сокращать". Надо вспомнить, что & - это логическое умножение и заменить знак на обычное умножение. Знак ∨ - логическое сложение, его заменить на +. А дальше почти как в обычной алгебре.
(a&b&c)∨a&b&c = a·b·c + a·b·c
Обозначим a·b·c через d. Получим d·d, а это всегда d.
Делаем обратные замены d = a·b·c = a&b&c
Вот набор правил этой забавной логической арифметики.
0+0=0, 0+1=1, 1+0=1, 1+1=1, d+0=d, d+1=1, d+d=d - сложение "ИЛИ"
0·0=0, 0·1=0, 1·0=0, 1·1=1, d·0=0, d·1=d, d·d=d - умножение "И"
¬0 = 1, ¬1 = 0 - инверсия "НЕ"
Объяснение:
Это весьма неэффективный алгоритм вычисления количества подстрок l в строке s. Работает так:
1) Функция find ищет первое вхождение строки l в строку s: индекс начала вхождения pos. Например, s = "xxxabdcabd", l = "abd". Сделаем так:
int pos = s.find(l);
Первым вхождением строки l в строку s является выделенная часть: "xxxabdcabd". В переменной pos будет храниться индекс буквы a, то есть 3.
Если вхождения нет, то в pos будет находиться -1.
2) Если вхождение есть, то увеличиваем счетчик подстрок. Теперь нам нужно искать подстроку l в строке s, начиная с позиции pos+1. Для этого в коде исходная строка обрезается с функции substr. Была "xxxabdcabd", стала "bdcabd".
Пример: s = s.substr(3+1);
Теперь в строке s удалены символы с индексами от 0 до 3 включительно.
Далее снова ищем первое вхождение строки l в уже новой строке s:
"bdcabd". Увеличиваем счетчик, снова обрезаем строку. Теперь s = "bd".
Снова попытаемся найти первое вхождение строки "abd" в уже строку "bd". Вхождения нет, s.find(l) == -1, завершаем цикл.