ホームに戻る
しゃくとり法

// しゃくとり法
// 条件を満たす連続した区間の最長のものをO(N)で求める。
// 考え方なので本来テンプレにはできないが、
// いざ組もうとするとバグがでるので見本を載せておきました。

// サンプル
// '0'と'1'からなる文字列より'1'が連続する最長連続区間の長さを求める。
// "011"なら2、"1100111110"なら5。

string s = "1100111110";

ll index1 = -1;
ll index2 = 0;
ll d[2] = {0,0};
ll mx = 0;
while(1){
  if(index1==s.sz)break;
  if(index2==s.sz)break;
  if(d[0]>0){
    if(s[index2]=='0')d[0]--;
    else d[1]--;
    index2++;
  }
  else{
    index1++;
    if(s[index1]=='0')d[0]++;
    else d[1]++;
  }
  mx = max(mx,index1-index2);
}

cout << mx << endl;
inserted by FC2 system