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?

【ABC394】AtCoder Beginner Contest 394【C++】

Posted at

コンテスト名

鹿島建設プログラミングコンテスト2025(AtCoder Beginner Contest 394)

コンテストURL

開催日

2025/02/22 21:00-22:40


A: 22222

解法

  • 文字列 $S$ を前から 1 文字ずつ調べ、2 なら出力する
ABC394A.cpp
#include <iostream>
#include <string>
using namespace std;

int main(){
    string s;
    cin >> s;

    for(int i=0; i<s.size(); i++){
        if(s[i]=='2'){
            cout << s[i];
        }
    }
    cout << endl;

    return 0;
}

B: cat

解法

  • 文字列の長さと文字列を vector<pair<int, string>> に記録して、昇順にソートする
ABC394B.cpp
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int main(){
    int n;
    cin >> n;

    string s;
    vector<pair<int, string>> V;
    for(int i=0; i<n; i++){
        cin >> s;
        V.emplace_back(s.size(), s);
    }

    sort(V.begin(), V.end());

    for(int i=0; i<n; i++){
        auto [x, t] = V[i];
        cout << t;
    }
    cout << endl;

    return 0;
}

C: Debug

解法

  • 文字列 $S$ を後ろから調べ、WAAC に変換する
ABC394C.cpp
#include <iostream>
#include <string>
using namespace std;

int main(){
    string s;
    cin >> s;

    for(int i=s.size()-1; i>0; i--){
        if(s[i-1]=='W' && s[i]=='A'){
            s[i-1] = 'A';
            s[i] = 'C';
        }
    }

    cout << s << endl;

    return 0;
}

D: Colorful Bracket Sequence

解法

  • スタックを用いて判定する
ABC394D.cpp
#include <iostream>
#include <vector>
#include <string>
#include <map>
using namespace std;

int main(){
    string s;
    cin >> s;

    if(s.size()%2!=0){
        cout << "No" << endl;
        return 0;
    }

    map<char, char> M;
    M[')'] = '(';
    M[']'] = '[';
    M['>'] = '<';

    vector<char> V;
    for(int i=0; i<s.size(); i++){
        if(V.empty() || M.count(s[i])==0){
            V.push_back(s[i]);
        }else{
            char c = V.back();
            if(c==M[s[i]]){
                V.pop_back();
            }else{
                cout << "No" << endl;
                return 0;
            }
        }
    }

    if(V.empty()){
        cout << "Yes" << endl;
    }else{
        cout << "No" << endl;
    }
    
    return 0;
}

E: Palindromic Shortest Path

解法

  • 回文の中央から幅優先探索 (BFS) する
ABC394E.cpp
#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int main(){
    int n;
    cin >> n;

    vector<vector<char>> C(n, vector<char>(n));
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            cin >> C[i][j];
        }
    }

    const int INF = 1e9;
    vector<vector<int>> A(n, vector<int>(n, INF));
    queue<pair<int, int>> Q;
    for(int i=0; i<n; i++){
        A[i][i] = 0;
        Q.emplace(i, i);
    }
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            if(j==i){
                continue;
            }
            if(C[i][j]!='-'){
                A[i][j] = 1;
                Q.emplace(i, j);
            }
        }
    }

    while(!Q.empty()){
        auto [x, y] = Q.front();
        Q.pop();

        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                if(C[i][x]!='-' && C[i][x]==C[y][j] && A[i][j]>A[x][y]+2){
                    A[i][j] = A[x][y] + 2;
                    Q.emplace(i, j);
                }
            }
        }
    }

    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            if(j){
                cout << " ";
            }
            if(A[i][j]==INF){
                cout << -1;
            }else{
                cout << A[i][j];
            }
        }
        cout << '\n';
    }

    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?