Найти длину самой длинной подстроки со всеми 1 в двоичной строке с k запросами
Учитывая строку размера n, состоящую из 0s и/или 1s, вы должны выполнить k запросов, и возможны два типа запросов.
"1"(без кавычек): выведите длину самой длинной подстроки со всеми "1".
"2 X"(без кавычек): где X-целое число от 1 до n.В этом запросе вы будете
измените символ в X-й позиции на '1' (возможно, что символ в I-й позиции
позиция была уже "1")
входной формат:
* Первая строка входных данных содержит n и k, где n-длина строки, А k - количество запросов.
* Следующая строка содержит строку из 0 и/или 1 длины n.
* Каждая из следующих k строк содержит запрос любого типа (например, 1 или 2).
выходной формат:
Для каждого запроса типа 1 выведите в новой строке максимальный размер подмассива со всеми 1.
Example Input: Example Output: 5 7 0 00000 1 1 1 2 3 3 1 2 5 1 2 4 1
Что я уже пробовал:
Мое решение: O(k*n) (если большинство запросов типа 1):
if(type==1){ int count=0, ans=0; for(int i=0;i<str.size();i++){ //longest len substring if(str[i]=='1'){ count++; }else{ ans=max(ans,count); count=0; } } printf("%d\n",ans); }else{ int xth; scanf("%d",&xth); str[xth-1]='1'; //update }
Я не могу найти эффективного решения, так как для запроса типа 1 единственное решение, которое я мог бы придумать, - это перебирать строку каждый раз и поддерживать переменную "count" со всеми 1 последовательно и, наконец, обновлять переменную "ans", когда ith str становится "0".
Я подумываю об использовании дерева сегментов, но не знаю, как это сделать. По мере необходимости хорошим решением должно быть O(k*log(n)) (выполнение запроса "type1" в log(n) времени)
PIEBALDconsult
Определите и реализуйте структуру данных, которая будет поддерживать необходимую вам информацию.
Я бы представил себе форму таблицы поиска-индексированную по символу (0,1) - карт, содержащих начальный индекс и длину.