C++の練習を兼ねて, AtCoder Regular Contest 108 の 問題A (Sum and Product) ~ 問題B (Abbreviate Fox) を解いてみた.
■感想.
1. 問題B は, stack を使えば良いことに気付けたので, AC版に到達できたと思う.
2. 時間を見つけて, 引き続き, 過去問を振り返っていきたいと思う.
本家のサイト AtCoder Regular Contest 108 解説 の 各リンク を ご覧下さい.
■C++版プログラム(問題A/AC版).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
// C++(GCC 9.2.1) #include <bits/stdc++.h> using namespace std; using LL = long long; #define repex(i, a, b, c) for(int i = a; i < b; i += c) #define repx(i, a, b) repex(i, a, b, 1) #define rep(i, n) repx(i, 0, n) #define repr(i, a, b) for(int i = a; i >= b; i--) int main(){ // 1. 入力情報. LL S, P; scanf("%lld %lld", &S, &P); // 2. 正の整数の組(M, N)があるかを確認. int u = (int)sqrt(P) + 1; bool ok = false; repx(m, 1, u){ LL M = (LL)m; if(P % M == 0){ LL N = P / M; if(M + N == S){ ok = true; // printf("M=%lld N=%lld\n", M, N); break; } } } // 3. 出力. printf("%s\n", ok ? "Yes" : "No"); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
[入力例] 3 2 [出力例] Yes ※AtCoderのテストケースより [入力例] 1000000000000 1 [出力例] No ※AtCoderのテストケースより [入力例] 455580 44428679939 [出力例] Yes ※ M=141421 N=314159 が 存在する. [入力例] 1010 2020 [出力例] No [入力例] 68087 20201122 [出力例] Yes ※ M=298 N=67789 が 存在する. [入力例] 6392027 332382700 [出力例] Yes ※ M=52 N=6391975 が 存在する. |
■C++版プログラム(問題B/AC版).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
// C++(GCC 9.2.1) #include <bits/stdc++.h> using namespace std; int main(){ // 1. 入力情報. int N; char c[202020]; scanf("%d %s", &N, c); string s(c); // 2. 部分文字列 fox を 取り除く. stack<char> st; for(auto &x : s){ // スタックが, 空 の 場合. if(st.empty()){ st.push(x); continue; } // スタックが, 空でない場合. if(!st.empty()){ // 現在取得した文字が, 'x' だった場合. if(x == 'x'){ if(st.size() >= 2){ // 一文字前. char o = st.top(); st.pop(); // 二文字前. char f = st.top(); st.pop(); // 評価. if(f == 'f' && o == 'o' && x == 'x'){ // 何もしない. continue; }else{ // スタックに保存. st.push(f); st.push(o); st.push(x); continue; } } } // それ以外. st.push(x); } } // 3. 出力. printf("%d\n", st.size()); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
[入力例] 6 icefox [出力例] 3 ※AtCoderのテストケースより [入力例] 7 firebox [出力例] 7 ※AtCoderのテストケースより [入力例] 48 ffoxoxuvgjyzmehmopfohrupffoxoxfofofoxffoxoxejffo [出力例] 27 ※AtCoderのテストケースより [入力例] 39 fofoxxffoxoffoxoffofoxfoxxofoxxfofoxxxx [出力例] 0 [入力例] 108 tfofoxxbfoxofofoxxcyskawnsvxmipfoxfoxfoxfoxqlrmwpyakcpkchzgilcqberkvnfofofoxxxvfoxernjukzjdphahtlunbnuavfoxm [出力例] 66 |
■参照サイト
AtCoder Regular Contest 108