Submission #1293896

#TimeUsernameProblemLanguageResultExecution timeMemory
1293896saidshikhovMatch (CEOI16_match)C++20
0 / 100
1 ms332 KiB
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <stack>
#include <algorithm>
using namespace std;

int main() {
    ifstream fin("match.in");
    ofstream fout("match.out");
    
    string s;
    fin >> s;
    int n = s.length();
    
    if (n % 2 != 0) {
        fout << -1 << endl;
        return 0;
    }
    
    // Собираем позиции для каждого символа
    vector<vector<int>> positions(26);
    for (int i = 0; i < n; i++) {
        positions[s[i] - 'a'].push_back(i);
    }
    
    // Проверяем четность
    for (int i = 0; i < 26; i++) {
        if (positions[i].size() % 2 != 0) {
            fout << -1 << endl;
            return 0;
        }
    }
    
    // Строим пары: для каждого символа соединяем i-ю позицию с (i + m/2)-й позицией
    vector<int> pair(n, -1);
    for (int c = 0; c < 26; c++) {
        int m = positions[c].size();
        for (int i = 0; i < m / 2; i++) {
            int open_idx = positions[c][i];
            int close_idx = positions[c][i + m / 2];
            pair[open_idx] = close_idx;
            pair[close_idx] = open_idx;
        }
    }
    
    // Проверяем, что пары образуют правильную скобочную последовательность
    stack<int> st;
    for (int i = 0; i < n; i++) {
        if (pair[i] > i) {
            // Это открывающая скобка (пара находится правее)
            st.push(i);
        } else {
            // Это закрывающая скобка
            if (st.empty() || pair[st.top()] != i) {
                fout << -1 << endl;
                return 0;
            }
            st.pop();
        }
    }
    
    if (!st.empty()) {
        fout << -1 << endl;
        return 0;
    }
    
    // Строим результат
    string result(n, ' ');
    for (int i = 0; i < n; i++) {
        if (pair[i] > i) {
            result[i] = '(';
        } else {
            result[i] = ')';
        }
    }
    
    fout << result << endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...