有効な括弧の最大長さ Longest valid Parentheses

Quiz

https://practice.geeksforgeeks.org/problems/longest-valid-parentheses/0

Submission

https://practice.geeksforgeeks.org/viewSol.php?subId=14381873&pid=1247&user=peroon

4
(()(
()()((
((()()())))
()(())(
2
4
10
6

Code

ll maxLen(string s){
  ll L = s.size();
  stack<ll> st;
  st.push(-1);

  ll len = 0;

  FOR(i, 0, L){
    if(s[i]=='('){
      st.push(i);
    }
    else{
      st.pop();

      if(!st.empty()){
        len = max(len, i - st.top());
      }
      else{
        st.push(i);
      }
    }
  }
  return len;
}

感想

  • DP使いそう、と思わせてスタックでした
  • 解けなかったので解法を見た。スタックの使い方が天才的・・・

配列からペアでない2つの数字を見つける。XOR

  • ペアでない数字は2つ(x, y)あるという設定
Input: {12, 23, 34, 12, 12, 23, 12, 45}
Output: 34 and 45

解法

  • 全てのXORを求める。x xor yだけ残る
  • a = x ^ y とする
  • LSB (Least Significant Bit) a & -a を求める
a = 01010
-aは反転して1を足したものなので、-a = 10110
LSB = 00010
  • x = 0
  • y = 0
  • 単位元から始めて、LSB & A[i]なものをxにXOR, その他をyにXORする
  • x, y以外はペアなので打ち消され、x, yそのものだけが残る
x = 0;
y = 0;
for(i = 0; i < size; i++)  
{  
    if(A[i] & LSB){
        x = x ^ A[i];  
    }
    else{
        y = y ^ A[i];  
    }
}  

kadane's algorithm ~最大部分和をO(N)~

用途

  • 負の値も含みうる数値配列にて、隣接した部分和の最大値をO(N)で求める
  • 読み方はカダネではなく、ケイデインズ
  • 最大部分列和(maximum segment sum)と言われる

最大部分和問題

例1

1 2 3 -2 5の場合
answer : 9

例2

-2 1 -3 4 -1 2 1 -5 4
answer : 6

例3

-1 -2 -3
answer : -1

参考

https://ark4rk.hatenablog.com/entry/2018/01/08/002508

Quiz

https://practice.geeksforgeeks.org/problems/kadanes-algorithm/0/?ref=self

Submission

https://practice.geeksforgeeks.org/viewSol.php?subId=14333102&pid=106&user=peroon

Code

ll kadanes_algorithm(vector<ll> &A){
    ll ans = A[0];
    ll s = A[0];
    FOR(i, 1, A.size()){
        s = max(s + A[i], A[i]);
        chmax(ans, s);
    }
    return ans;
}

動画

www.youtube.com

問題

Stove (AOJ)

Quiz

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0647

他人の解法

http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=3593831#1

説明

  • 例えば4人来客、マッチ3本の場合、1つの隙間部分は点けっぱなしにする必要がある
  • 隙間の間隔は小さいものを選びたい
  • N人来客の場合、N-1の隙間ができる(間隔0でも隙間と考える)
  • priority_queueに隙間を入れることで、小さい方から取り出せる
  • 来客中のN秒は点けることが確定で、それに(N-K)個の隙間の長さを加えたものが答え

別解法:ソート