Problem:
C: 一致

問題

長さ $N$ の数列 $a_i$ が与えられる。
次の条件を満たす整数 $K (1 \le K \le N)$ を全て出力せよ。

条件:
$a_1, \cdots, a_K$ をうまく並び替えると $a_{N-K+1}, \cdots, a_N$ と一致する。

制約

$1 \le N \le 10^5$

$1 \le a_i \le 10^9$

入力は全て整数

入力:

$N$

$a_1 \cdots a_N$

出力:

条件を満たす $K$ を昇順に空白区切りで出力せよ。また末尾に改行を出力せよ。

サンプル

サンプル入力 1

8
5 2 4 9 4 9 2 5

サンプル出力 1

1 2 4 6 7 8

サンプル入力 2

3
5 7 5

サンプル出力 2

1 2 3

サンプル入力 3

9
118 118 97 116 97 97 114 110 101

サンプル出力 3

9

Solution in C++14 (judge verdict: Accepted)

#include <iostream>
#include <vector>
#include <map>
using namespace std;

int main(){
  int N;
  cin >> N;
  vector<int> A(N);
  for(int i = 0; i < N; ++i) cin >> A[i];
  int d = 0;
  map<int,int> D;
  vector<int> K;
  for(int k = 0; k < N; ++k){
    d -= abs(D[A[k]]);
    ++D[A[k]];
    d += abs(D[A[k]]);
    d -= abs(D[A[N-1-k]]);
    --D[A[N-1-k]];
    d += abs(D[A[N-1-k]]);
    if(!d) K.push_back(k+1);
    // cerr << k << " " << d << endl;
  }
  for(size_t i = 0; i < K.size(); ++i)
    cout << K[i] << (i+1 < K.size() ? " " : "\n");
}