提出 #577452


ソースコード 拡げる

#include <bits/stdc++.h>
using namespace std;

#define F first
#define S second
#define REP(i,n) for(int i = 0; i < (int)(n); ++i)
#define rep REP
#define SZ(a) ((int)(a).size())
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mp make_pair
typedef long long ll;

int solve(const string &s){
  vector<int> L(s.size() + 1);
  vector<int> R(s.size() + 1);
  L[0] = 0;
  R[0] = 0;
  REP(i, s.size()){
    if (s[i] == '<'){
      L[i + 1] = L[i] + 1;
      R[i + 1] = R[i];
    } else {
      L[i + 1] = L[i];
      R[i + 1] = R[i] + 1;
    }
  }

  int res = 0;
  REP(i, s.size()) if (s[i] == '>'){
    int l = R[i + 1];           // '>'
    int r = L[s.size()] - L[i + 1]; // '<'
    int d = min(l, r);
    if (r >= l){
      int lb = i + 1;
      int ub = s.size();
      
      // cout << s << " " << i << " " << d << " " << L[6] - L[i + 1] <<endl;
      while (ub - lb > 1){
        int mb = (lb + ub) >> 1;
        if (L[mb] - L[i + 1] >= d){
          ub = mb;
        } else {
          lb = mb;
        }
      }
      res = max(res, ub);
    } else {
      int lb = 0;
      int ub = i + 1;
      int d = l - r;
      while (ub - lb > 1){
        int mb = (ub + lb) >> 1;
        if (R[mb] >= d) ub = mb;
        else lb = mb;
      }
      res = max(res, (int)s.size() - lb);
    }
  }
  return res;
}

int naive(string s){
  int ans = 0;
  rep(i, SZ(s)){
    vector<bool> use(SZ(s));
    int cur = i;
    int dir = s[i] == '<' ? -1 : 1;
    int cnt = 0;
    while(cur >= 0 && cur < SZ(s)){
      if(use[cur]){
        cur += dir;
        continue;
      }
      use[cur] = true;
      ++cnt;
      dir = s[cur] == '<' ? -1 : 1;
    }
    ans = max(ans, cnt);
  }
  return ans;
}

int main(int argc, char **argv){
  int n;
  string s;
  while (cin >> n >> s){
    int res = solve(s);
    // int na  = naive(s);
    reverse(ALL(s));
    for (auto &c : s) {
      if (c == '>') c = '<';
      else c = '>';
    }
    // cout << s << endl;
    res = max(res, solve(s));
    // if(naive(s) != res || na != naive(s)){
    //   cout << na << endl;
    //   cout << "naive " << naive(s) << endl;
    //   cout << res << endl;
    //   cout << s << endl;
    //   exit(1);
    // }
    cout << res << endl;
  }
}

提出情報

提出日時
問題 D - Line Gimmick
ユーザ mmnegainoido
言語 C++11 (GCC 4.8.1)
得点 100
コード長 2332 Byte
結果 AC
実行時間 49 ms
メモリ 1824 KiB

ジャッジ結果

セット名 All
得点 / 配点 100 / 100
結果
AC × 29
セット名 テストケース
All 00_sample_00, 00_sample_01, 00_sample_02, 00_sample_03, 10_simple_small_000, 10_simple_small_001, 10_simple_small_002, 10_simple_small_003, 10_simple_small_004, 11_simple_med_000, 11_simple_med_001, 11_simple_med_002, 11_simple_med_003, 11_simple_med_004, 12_simple_large_000, 12_simple_large_001, 12_simple_large_002, 12_simple_large_003, 12_simple_large_004, 21_answer_med_000, 21_answer_med_001, 21_answer_med_002, 21_answer_med_003, 21_answer_med_004, 22_answer_large_000, 22_answer_large_001, 22_answer_large_002, 22_answer_large_003, 22_answer_large_004
ケース名 結果 実行時間 メモリ
00_sample_00 AC 24 ms 928 KiB
00_sample_01 AC 24 ms 748 KiB
00_sample_02 AC 24 ms 748 KiB
00_sample_03 AC 23 ms 924 KiB
10_simple_small_000 AC 24 ms 748 KiB
10_simple_small_001 AC 24 ms 812 KiB
10_simple_small_002 AC 24 ms 676 KiB
10_simple_small_003 AC 24 ms 808 KiB
10_simple_small_004 AC 23 ms 920 KiB
11_simple_med_000 AC 24 ms 928 KiB
11_simple_med_001 AC 24 ms 928 KiB
11_simple_med_002 AC 27 ms 804 KiB
11_simple_med_003 AC 24 ms 748 KiB
11_simple_med_004 AC 24 ms 924 KiB
12_simple_large_000 AC 36 ms 1436 KiB
12_simple_large_001 AC 35 ms 1316 KiB
12_simple_large_002 AC 49 ms 1700 KiB
12_simple_large_003 AC 45 ms 1708 KiB
12_simple_large_004 AC 45 ms 1736 KiB
21_answer_med_000 AC 44 ms 1692 KiB
21_answer_med_001 AC 45 ms 1704 KiB
21_answer_med_002 AC 46 ms 1692 KiB
21_answer_med_003 AC 36 ms 1316 KiB
21_answer_med_004 AC 45 ms 1708 KiB
22_answer_large_000 AC 37 ms 1440 KiB
22_answer_large_001 AC 45 ms 1824 KiB
22_answer_large_002 AC 39 ms 1516 KiB
22_answer_large_003 AC 37 ms 1564 KiB
22_answer_large_004 AC 46 ms 1824 KiB