Учитывая двоичную строку s, нам нужно найти число подстрок, содержащее ровно k символов, которые являются «1».подстроки с k единицами
Например: s = "1010" и к = 1, ответ = 6.
Теперь, я решил его с помощью двоичного поиска техники по кумулятивным массива суммы.
Я также использовал другой подход для его решения. Подход заключается в следующем:
Для каждой позиции я, найти общие подстроки, которые заканчиваются на я, содержащий ровно к символы, «1».
Чтобы найти полные подстроки, которые заканчиваются в i, содержащие ровно k символов, которые равны 1, его можно представить как множество индексов j, так что подстрока j в i содержит точно k '1. Ответом будет размер набора. Теперь, чтобы найти все такие J для данной позиции я, мы можем перефразировать проблему, как найти все J такое, что
число единиц из [1] до [J - 1] = общее количество единиц от 1 до i - [общее число единиц от j до i = k].
т.е. число единиц от [1] до [J - 1] = С [я] - к
которая равна C [J - 1] = С [я] - к,
где C - совокупный массив сумм, где C [i] = сумма символов строки от 1 до i. Теперь проблема проста, потому что мы можем найти все возможные значения j, используя уравнение, посчитав все префиксы, которые суммируются с C [i] - k.
Но я нашел это решение,
int main() {
cin >> k >> S;
C[0] = 1;
for (int i = 0; S[i]; ++i) {
s += S[i] == '1';
++C[s];
}
for (int i = k; i <= s; ++i) {
if (k == 0) {
a += (C[i] - 1) * C[i]/2;
} else {
a += C[i] * C[i - k];
}
}
cout << a << endl;
return 0;
}
В коде, S является данной строкой и K, как описано выше, C является совокупным массивом суммы и есть ответ. Что именно делает код, используя умножение, я не знаю. Может ли кто-нибудь объяснить алгоритм?
Я просто понял к = 0 часть, если к = 0, так как с [I] представляет собой число появлений совокупной суммы, равной I, мы должны иметь (в [I] - 1) обнуляет смежно в подстроке. Итак, количество возможных подстрок, которые суммируются до нуля = (c [i] - 1) * (c [i] - 1 + 1)/2 = c [i] * (c [i] - 1)/2, подсчитывает количество возможных подстрок строки со всеми нулями символов. – user3263245
Я думаю, что у меня есть и другая часть. – user3263245