vectorのrotate 使い方

rotate(first, middle, last);

middleの要素が先頭、middle-1の要素が末尾となるように、
[first,last)の要素の並びを回転させる。

https://cpprefjp.github.io/reference/algorithm/rotate.html

void rotate_test(){
  VI A = {1,2,3,4,5,6,7};

  // 左に1つシフト。長さ1はないとRE
  rotate(A.begin(), A.begin()+1, A.end());
  debug(A);
  // => {2, 3, 4, 5, 6, 7, 1}

  // 6個先
  rotate(A.begin(), A.begin()+6, A.end());
  debug(A);
  // => {1, 2, 3, 4, 5, 6, 7}

  // begin+7個先には何もない。それが先頭に来て、残りが後ろに続く(ギリギリ)
  rotate(A.begin(), A.begin()+7, A.end());
  debug(A);
  // => {1, 2, 3, 4, 5, 6, 7}

  // 8個先 さすがにエラー
  rotate(A.begin(), A.begin()+8, A.end());
  debug(A);

  // error
  rotate(A.begin(), A.begin()+100, A.end());
  debug(A);
}
  • 第2引数のoffsetにはvectorの長さまでOK. それ以上だとエラー
  • 左方向へのシフトであることに注意

右方向シフト

使う問題

int main(){
    // input
    string s;
    cin>>s;
    ll N=s.size();
 
    vector<string> S;
    rep(i,N){
      rotate(s.begin(), s.begin()+1, s.end()); // 1つシフト
      S.push_back(s);
    }
    sort(ALL(S));
 
    p(S[0]);
    p(S.back());
    
    return 0;
}

注意点

  • rotateに与えたvectorそのものを書き換える