結果
| 問題 |
No.1577 織姫と彦星2
|
| ユーザー |
yuruhiya
|
| 提出日時 | 2021-06-29 22:51:36 |
| 言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 180 ms / 2,000 ms |
| コード長 | 2,756 bytes |
| コンパイル時間 | 3,475 ms |
| コンパイル使用メモリ | 98,144 KB |
| 最終ジャッジ日時 | 2025-01-22 14:58:52 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 5 |
| other | AC * 53 |
ソースコード
#pragma GCC optimize("O3")
#pragma GCC target("avx2")
#pragma GCC optimize("unroll-loops")
//#pragma GCC optimize ("Ofast")
#include <cstdio>
#include <vector>
#include <unordered_map>
#include <map>
#include <queue>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define FOR(i, m, n) for (int i = (m); i < (n); ++i)
#define rrep(i, n) for (int i = (n)-1; i >= 0; --i)
#define rfor(i, m, n) for (int i = (m); i >= (n); --i)
using ll = long long;
#ifdef _WIN32
#define getchar_unlocked _getchar_nolock
#define putchar_unlocked _putchar_nolock
#define fwrite_unlocked _fwrite_nolock
#define fread_unlocked _fread_nolock
#endif
#if __has_include(<library/dump.hpp>)
#include <library/dump.hpp>
#else
#define dump(...) ((void)0)
#endif
// #define USE_FREAD
#ifdef USE_FREAD
struct Input {
static constexpr size_t MAX_SIZE = 4400019;
char buf[MAX_SIZE];
size_t i, end;
Input() {
i = 0;
end = fread_unlocked(buf, 1, MAX_SIZE, stdin);
}
inline int gc() {
if (i < end) {
return buf[i++];
} else {
return EOF;
}
}
} in;
#define gc in.gc
#else
#define gc getchar_unlocked
#endif // USE_FREAD
// #define USE_FWRITE
#ifdef USE_FWRITE
struct Output {
static constexpr size_t MAX_SIZE = 4000009;
char buf[MAX_SIZE];
size_t i = 0;
void pc(int c) {
buf[i++] = c;
}
~Output() {
fwrite_unlocked(buf, 1, i, stdout);
}
} out;
#define pc out.pc
#else
#define pc putchar_unlocked
#endif // USE_FWRITE
inline void inui(int& v) noexcept {
v = 0;
for (char c = gc(); '0' <= c && c <= '9'; c = gc()) v = v * 10 + (c - '0');
}
inline void inul(ll& v) noexcept {
v = 0;
for (char c = gc(); '0' <= c && c <= '9'; c = gc()) v = v * 10 + (c - '0');
}
inline void puti(int v) noexcept {
if (v < 0) pc('-'), v = -v;
char b[10];
int n = 0;
while (v) b[n++] = '0' + v % 10, v /= 10;
if (!n) b[n++] = '0';
while (n--) pc(b[n]);
}
inline void putui(int v) noexcept {
char b[10];
int n = 0;
while (v) b[n++] = '0' + v % 10, v /= 10;
if (!n) b[n++] = '0';
while (n--) pc(b[n]);
}
// ---------------------------------------------------------------- //
int n, s, e, stone[500003], dist[500003];
int main() {
inui(n), inui(s), inui(e);
rep(i, n) inui(stone[i]);
stone[n] = s;
stone[n + 1] = e;
map<int, int> hash;
rep(i, n) hash[stone[i]] = i;
hash[s] = n;
hash[e] = n + 1;
queue<int> que;
que.push(n);
dist[n] = 1;
while (!que.empty()) {
int i = que.front();
que.pop();
int d = dist[i];
if (i == n + 1) {
putui(d - 2), pc('\n');
return 0;
}
for (int bit = 1, _ = 30; _--; bit <<= 1) {
if (auto it = hash.find(stone[i] ^ bit); it != hash.end()) {
int j = it->second;
if (dist[j] == 0) {
dist[j] = d + 1;
que.push(j);
}
}
}
}
pc('-'), pc('1'), pc('\n');
}
yuruhiya