結果

問題 No.517 壊れたアクセサリー
ユーザー kura197kura197
提出日時 2019-11-05 12:42:46
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 2 ms / 2,000 ms
コード長 2,383 bytes
コンパイル時間 1,370 ms
コンパイル使用メモリ 171,980 KB
実行使用メモリ 6,944 KB
最終ジャッジ日時 2024-09-15 00:01:12
合計ジャッジ時間 2,148 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
6,816 KB
testcase_01 AC 1 ms
6,944 KB
testcase_02 AC 2 ms
6,944 KB
testcase_03 AC 2 ms
6,940 KB
testcase_04 AC 2 ms
6,940 KB
testcase_05 AC 1 ms
6,940 KB
testcase_06 AC 1 ms
6,944 KB
testcase_07 AC 2 ms
6,944 KB
testcase_08 AC 2 ms
6,944 KB
testcase_09 AC 2 ms
6,940 KB
testcase_10 AC 1 ms
6,940 KB
testcase_11 AC 1 ms
6,940 KB
testcase_12 AC 2 ms
6,944 KB
testcase_13 AC 2 ms
6,940 KB
testcase_14 AC 1 ms
6,940 KB
testcase_15 AC 2 ms
6,940 KB
testcase_16 AC 2 ms
6,940 KB
testcase_17 AC 2 ms
6,940 KB
testcase_18 AC 2 ms
6,940 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
#define REP(i, n) for(int i=0; i<n; i++)
#define REPi(i, a, b) for(int i=int(a); i<int(b); i++)
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }
const ll MOD = 1e9+7;

vector<int> X[30];
vector<int> Y[30];

int main(){
    int N;
    cin >> N;
    bool fail = false;
    set<int> node;
    int last;
    REP(i,N){
        string S;
        cin >> S;
        last = S[0]-'A';
        node.insert(last);
        REPi(i,1,S.length()){
            int c = S[i]-'A';
            node.insert(c);
            if(X[last].size() == 0)
                X[last].push_back(c);
            else if(X[last][0] != c)
                fail = true;
            if(Y[c].size() == 0)
                Y[c].push_back(last);
            else if(Y[c][0] != last)
                fail = true;
            last = c;
        }
    }

    int M;
    cin >> M;
    REP(i,M){
        string S;
        cin >> S;
        last = S[0]-'A';
        node.insert(last);
        REPi(i,1,S.length()){
            int c = S[i]-'A';
            node.insert(c);
            if(X[last].size() == 0)
                X[last].push_back(c);
            else if(X[last][0] != c)
                fail = true;
            if(Y[c].size() == 0)
                Y[c].push_back(last);
            else if(Y[c][0] != last)
                fail = true;
            last = c;
        }
    }

    if(node.size() == 1){
        cout << (char)(last + 'A') << endl;
        return 0;
    }

    int head = -1;
    REP(i,26){
        if(X[i].size() == 1 && Y[i].size() == 0){
            if(head < 0)
                head = i;
            else
                fail = true;
        }
    }
    if(head < 0) fail = true;

    string ans = "";
    int v = head;
    ans += (v + 'A');
    node.erase(v);
    while(1){
        if(X[v].size() == 0)
            break;

        if(X[v].size() != 1){
            fail = true;
            break;
        }
        else{
            v = X[v][0];
            node.erase(v);
            ans += (v + 'A');
        }
    }

    if(node.size() > 0)
        fail = true;

    if(fail){
        cout << -1 << endl;
        return 0;
    }

    cout << ans << endl;
    return 0;
}
0