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 (judge verdict: Time Limit Exceeded)

// AOJ 2876 Anagram
// 2018.4.16 bal4u
 
#include <stdio.h>

#define HASHSIZ 19937
typedef struct { int a; } HASH;
HASH hash[HASHSIZ+2], *hashend = hash+HASHSIZ;

int insert(int a)
{
	HASH *p = hash + a % HASHSIZ;
	while (p->a) {
		if (p->a == a) return p-hash;
		if (++p == hashend) p = hash;
	}
	p->a = a;
	return p-hash;
}

// バッファを経ずstdinから数値を得る
//#define getchar_unlocked()  getchar()
int in()
{
	int n = 0, c = getchar_unlocked();
	do n = 10*n + (c & 0xf), c = getchar_unlocked(); while (c >= '0');
	return n;
}

int a[100002];
int ans[100002], sz;

int main()
{
	int N, i, sf, sb;
	int *f, *b;

	N = in();
	for (i = 0; i < N; i++) {
		a[i] = in();
		insert(a[i]);
	}

	sf = sb = 0;
	f = a, b = a+N-1;
	for (i = 1; i <= N; i++) {
		sf += insert(*f++);
		sb += insert(*b--);
		if (sf == sb) ans[sz++] = i;
	}

	printf("%d", ans[0]);
	for (i = 1; i < sz; i++) printf(" %d", ans[i]);
	putchar('\n');
	return 0;
}