Moves on Binary Tree
問題
D – Moves on Binary Tree
プログラミング初級者から上級者まで楽しめる、競技プログラミングコンテストサイト「AtCoder」。オンラインで毎週開催プログラミングコンテストを開催しています。競技…
記録
- 2022/3/13 解法わからず。
解法
- 2進数で考える。
U
のとき末尾1文字削除する。L
のとき末尾に0を加える。R
のとき末尾に1を加える。
コード例
#include <bits/stdc++.h> using namespace std; #include <atcoder/all> using namespace atcoder; using ll = long long; using P = pair<ll, ll>; #define rep(i, n) for(int i = 0; i < (n); ++i) // using mint = modint998244353; // using mint = modint1000000007; // const int mod = 1000000007; // const ll INF = 1LL << 62; // const int INF = 1001001001; vector<string> binary(ll v) { vector<string> result; for(int i = 0; 0 < v; i++) { result.push_back(to_string(v % 2)); v = v / 2; } reverse(result.begin(), result.end()); return result; } int main() { ll N, X; cin >> N >> X; string S; cin >> S; vector<string> v = binary(X); rep(i, N) { if(S[i] == 'U') { v.pop_back(); } else if(S[i] == 'L') { v.push_back("0"); } else { v.push_back("1"); } } ll ans = 0; int n = v.size(); rep(i, n) { ans = ans * 2 + stoi(v[i]); } cout << ans << endl; return 0; }