#include <iostream>
#include "bits/stdc++.h"
using namespace std;
int main()
{
int arr[4] = {3, 5, 7, 4};
// Prefix
vector<int>pre(5); // 4+1 (1-Based)
for(int i=1; i<5; i++)
{
pre[i] = pre[i-1] + arr[i-1]; // all values before this index + value of current index
}
// Suffix
vector<int>suff(6); // 4 + 2 (1-Based)
for(int i=4; i>=1; i--)
{
suff[i] = suff[i+1] + arr[i-1]; // all values after this index + value of current index
}
// Frequency range (count)
// Count 'a' from range l to r
string a = "abccabaac";
vector<int>freq(a.size()+1); // (1-Based)
for(int i=1; i<=a.size(); i++)
{
if(a[i-1]=='a')
{
freq[i]=1;
}
}
// {1,0,0,0,1,0,1,1,0}
for(int i=1; i<=a.size(); i++)
{
freq[i]+=freq[i-1];
}
// {1,1,1,1,2,2,3,4,4}
int rl=3,rr=6;
// freq[rr]-freq[rl-1]
// Range
// 1 3
// 2 3
// 1 4
// Add the value to left and subtract from right + 1
vector<int>range(6); // Size = max right + 1
// 1 3
range[1]++;
range[4]--;
// 2 3
range[2]++;
range[4]--;
// 1 4
range[1]++;
range[5]--;
for(int i=1; i<6; i++)
{
range[i]+=range[i-1];
}
// range = {2,3,3,1}
// Sliding Window
// Q1: Find max sum of subarray
int arr1[6] = {-1,2,3,1,-3,2};
int sum=0,maxi=0;
for(int i=0; i<6; i++)
{
sum+=arr1[i];
if(sum < 0)
{
sum = 0; // No need for negative values
}
maxi=max(maxi,sum);
}
// maxi = 6
//Q2: Find count of subarrays with sum = k
int arr2[9] = {2,-1,3,5,-6,2,4};
int k=2;
int summ=0;
map<int,int>mp;
mp[0]++;
int s=0,cntt=0;
for(int i=0; i<9; i++)
{
summ+=arr2[i];
cntt+=mp[summ-k];
mp[summ]++;
}
// cntt = 4
//Q3: Find max length of string with maximum number of 0's = k
string ss = "010100011";
int kk=3;
int left=0,right=0;
int cntsofar=0;
int maxii=0;
while(left<ss.size() && right<ss.size())
{
if(cntsofar <= kk)
{
maxii=max(maxii,right-left+1);
if(ss[right]=='0')
{
cntsofar++;
}
right++;
}
else
{
if(ss[left]=='0')
{
cntsofar--;
}
left++;
}
}
// maxii = 6
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSAiYml0cy9zdGRjKysuaCIKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgbWFpbigpCnsKICAgIGludCBhcnJbNF0gPSB7MywgNSwgNywgNH07CgogICAgLy8gUHJlZml4CiAgICB2ZWN0b3I8aW50PnByZSg1KTsgLy8gNCsxICgxLUJhc2VkKQogICAgZm9yKGludCBpPTE7IGk8NTsgaSsrKQogICAgewogICAgICAgIHByZVtpXSA9IHByZVtpLTFdICsgYXJyW2ktMV07IC8vIGFsbCB2YWx1ZXMgYmVmb3JlIHRoaXMgaW5kZXggKyB2YWx1ZSBvZiBjdXJyZW50IGluZGV4CiAgICB9CgogICAgLy8gU3VmZml4CiAgICB2ZWN0b3I8aW50PnN1ZmYoNik7IC8vIDQgKyAyICgxLUJhc2VkKQogICAgZm9yKGludCBpPTQ7IGk+PTE7IGktLSkKICAgIHsKICAgICAgICBzdWZmW2ldID0gc3VmZltpKzFdICsgYXJyW2ktMV07IC8vIGFsbCB2YWx1ZXMgYWZ0ZXIgdGhpcyBpbmRleCArIHZhbHVlIG9mIGN1cnJlbnQgaW5kZXgKICAgIH0KCiAgICAvLyBGcmVxdWVuY3kgcmFuZ2UgKGNvdW50KQogICAgLy8gQ291bnQgJ2EnIGZyb20gcmFuZ2UgbCB0byByCiAgICBzdHJpbmcgYSA9ICJhYmNjYWJhYWMiOwogICAgdmVjdG9yPGludD5mcmVxKGEuc2l6ZSgpKzEpOyAvLyAoMS1CYXNlZCkKICAgIGZvcihpbnQgaT0xOyBpPD1hLnNpemUoKTsgaSsrKQogICAgewogICAgICAgIGlmKGFbaS0xXT09J2EnKQogICAgICAgIHsKICAgICAgICAgICAgZnJlcVtpXT0xOwogICAgICAgIH0KICAgIH0KICAgIC8vIHsxLDAsMCwwLDEsMCwxLDEsMH0KICAgIGZvcihpbnQgaT0xOyBpPD1hLnNpemUoKTsgaSsrKQogICAgewogICAgICAgIGZyZXFbaV0rPWZyZXFbaS0xXTsKICAgIH0KICAgIC8vIHsxLDEsMSwxLDIsMiwzLDQsNH0KICAgIGludCBybD0zLHJyPTY7CiAgICAvLyBmcmVxW3JyXS1mcmVxW3JsLTFdCgogICAgLy8gUmFuZ2UKICAgIC8vIDEgMwogICAgLy8gMiAzCiAgICAvLyAxIDQKICAgIC8vIEFkZCB0aGUgdmFsdWUgdG8gbGVmdCBhbmQgc3VidHJhY3QgZnJvbSByaWdodCArIDEKICAgIHZlY3RvcjxpbnQ+cmFuZ2UoNik7IC8vIFNpemUgPSBtYXggcmlnaHQgKyAxCiAgICAvLyAxIDMKICAgIHJhbmdlWzFdKys7CiAgICByYW5nZVs0XS0tOwogICAgLy8gMiAzCiAgICByYW5nZVsyXSsrOwogICAgcmFuZ2VbNF0tLTsKICAgIC8vIDEgNAogICAgcmFuZ2VbMV0rKzsKICAgIHJhbmdlWzVdLS07CiAgICBmb3IoaW50IGk9MTsgaTw2OyBpKyspCiAgICB7CiAgICAgICAgcmFuZ2VbaV0rPXJhbmdlW2ktMV07CiAgICB9CiAgICAvLyByYW5nZSA9IHsyLDMsMywxfQoKICAgIC8vIFNsaWRpbmcgV2luZG93CiAgICAvLyBRMTogRmluZCBtYXggc3VtIG9mIHN1YmFycmF5CiAgICBpbnQgYXJyMVs2XSA9IHstMSwyLDMsMSwtMywyfTsKICAgIGludCBzdW09MCxtYXhpPTA7CiAgICBmb3IoaW50IGk9MDsgaTw2OyBpKyspCiAgICB7CiAgICAgICAgc3VtKz1hcnIxW2ldOwogICAgICAgIGlmKHN1bSA8IDApCiAgICAgICAgewogICAgICAgICAgICBzdW0gPSAwOyAvLyBObyBuZWVkIGZvciBuZWdhdGl2ZSB2YWx1ZXMKICAgICAgICB9CiAgICAgICAgbWF4aT1tYXgobWF4aSxzdW0pOwogICAgfQogICAgLy8gbWF4aSA9IDYKCiAgICAvL1EyOiBGaW5kIGNvdW50IG9mIHN1YmFycmF5cyB3aXRoIHN1bSA9IGsKICAgIGludCBhcnIyWzldID0gezIsLTEsMyw1LC02LDIsNH07CiAgICBpbnQgaz0yOwogICAgaW50IHN1bW09MDsKICAgIG1hcDxpbnQsaW50Pm1wOwogICAgbXBbMF0rKzsKICAgIGludCBzPTAsY250dD0wOwogICAgZm9yKGludCBpPTA7IGk8OTsgaSsrKQogICAgewogICAgICAgIHN1bW0rPWFycjJbaV07CiAgICAgICAgY250dCs9bXBbc3VtbS1rXTsKICAgICAgICBtcFtzdW1tXSsrOwogICAgfQogICAgLy8gY250dCA9IDQKCiAgICAvL1EzOiBGaW5kIG1heCBsZW5ndGggb2Ygc3RyaW5nIHdpdGggbWF4aW11bSBudW1iZXIgb2YgMCdzID0gawogICAgc3RyaW5nIHNzID0gIjAxMDEwMDAxMSI7CiAgICBpbnQga2s9MzsKICAgIGludCBsZWZ0PTAscmlnaHQ9MDsKICAgIGludCBjbnRzb2Zhcj0wOwogICAgaW50IG1heGlpPTA7CiAgICB3aGlsZShsZWZ0PHNzLnNpemUoKSAmJiByaWdodDxzcy5zaXplKCkpCiAgICB7CiAgICAgICAgaWYoY250c29mYXIgPD0ga2spCiAgICAgICAgewogICAgICAgICAgICBtYXhpaT1tYXgobWF4aWkscmlnaHQtbGVmdCsxKTsKICAgICAgICAgICAgaWYoc3NbcmlnaHRdPT0nMCcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNudHNvZmFyKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmlnaHQrKzsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaWYoc3NbbGVmdF09PScwJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY250c29mYXItLTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZWZ0Kys7CiAgICAgICAgfQogICAgfQogICAgLy8gbWF4aWkgPSA2Cn0K