0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AtCoder Beginner Contest 380

Last updated at Posted at 2024-11-17

A - 123233

O(N)
10個の要素を用意した配列か、mapを使用しましょう。
出現回数を数えて判定します。

C++
#include <bits/stdc++.h>
#include <atcoder/all>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

int main() {
    string S;
    cin >> S;
    map<int, int> mp;
    rep(i, 6) mp[S[i]]++;

    if(mp['1'] == 1 && mp['2'] == 2 && mp['3'] == 3){
        cout << "Yes" << endl;
    }else{
        cout << "No" << endl;
    }

    return 0;
} 

B - Hurdle Parsing

O(N)
シミュレートしましょう。

C++
#include <bits/stdc++.h>
#include <atcoder/all>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

int main() {
    string S;
    cin >> S;
    int N = S.size();
    vector<int> A;
    repx(i, 0, N){
        if(S[i] == '|'){
            A.push_back(0);
        }else{
            A.back()++;
        }
    }
    A.pop_back();

    rep(i, A.size()){
        cout << A[i];
        if(i < A.size() - 1) cout << ' ';
        else cout << endl;
    }

    return 0;
} 

C - Move Segment

O(N)
シミュレートの問題です。
綺麗なコードが書きたいならランレングス圧縮です。
サンプル1を基準にしましょう。

15 3
010011100011001

の時にランレングス圧縮します。

{0, 1} {1, 1} {0, 2} {1, 3} {0,3} {1, 2} {0, 2} {1, 1}

{1, 3}の箇所か、{1, 2}の箇所で判定を行いましょう。
{0,3}, {1, 2}を入れ替えましょう。

C++
        if(rle[i].first == '1'){
            cnt++;
            if(cnt == K-1){
                swap(rle[i+2], rle[i+1]);
            }
        }

最後に文字列へ復元を行い出力します。

C++
#include <bits/stdc++.h>
#include <atcoder/all>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

int main() {
    int N, K;
    cin >> N >> K;
    string S;
    cin >> S;

    vector<pair<char, int>> rle;
    for(auto c:S){
        if(rle.size() && rle.back().first == c){
            rle.back().second++;
        }else{
            rle.push_back({c, 1});
        }
    }

    int cnt = 0;
    for(int i=0; i<rle.size(); i++){
        if(rle[i].first == '1'){
            cnt++;
            if(cnt == K-1){
                swap(rle[i+2], rle[i+1]);
            }
        }
    }

    string ans;
    for(auto [c, cnt]:rle){
        for(int i=0; i<cnt; i++){
            ans += c;
        }
    }
    cout << ans << endl;

    return 0;
} 

D - Strange Mirroring

O(N)
K_i - 1の1のbitの数を数える問題です。
サンプル1を見ましょう。

aB
16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

aBを基準に
「小文字を大文字に書き換えた文字列をT」
を作成し、
「SとTとをこの順に連結した文字列を新たなS」
を作成します。

aB Ab Ab aB Ab aB aB Ab

規則性が分かりません。
文字列の数は、

Sの文字数 = Sの文字数 * 2 

と増えていきます。
2進数が関係あるかもしません。

0 1 2 3 4 5 6 7
aB Ab Ab aB Ab aB aB Ab
000 001 010 011 100 101 110 111

K_iをSの文字数で除算をし、1のbitの数を数えます。
1のbitの数の偶数、奇数か判定をします。
奇数の時に小文字を大文字、大文字を小文字に書き換えましょう。

  • popcountはC++20の関数です
  • 開発環境を構築しておきましょう
C++
#include <bits/stdc++.h>
#include <atcoder/all>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

int main() {
    string S, T;
    cin >> S;
    ll Q;
    cin >> Q;
    vector<ll> K(Q);
    rep(i, Q) cin >> K[i];

    int N = S.size();
    rep(i, Q){
        ll k = K[i] - 1;
        ll num = k / N;
        ll index = k % N;
        
        if(popcount((unsigned long long)num) % 2 == 0){
            cout << S[index];
        }else{
            if(isupper(S[index])) cout << (char)(S[index] + 32);
            else cout << (char)(S[index] - 32);
        }

        if(i < Q-1) cout << ' ';
        else cout << endl;
    }

    return 0;
} 
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?