Submission #1293894

#TimeUsernameProblemLanguageResultExecution timeMemory
1293894saidshikhovMatch (CEOI16_match)C++20
0 / 100
0 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<int> char_count(26, 0);
    for (char c : s) {
        char_count[c - 'a']++;
    }
    
    for (int i = 0; i < 26; i++) {
        if (char_count[i] % 2 != 0) {
            fout << -1 << endl;
            return 0;
        }
    }
    
    string result(n, ' ');
    stack<int> st;
    vector<int> last_used(26, -1);
    
    for (int i = 0; i < n; i++) {
        int char_idx = s[i] - 'a';
        
        if (last_used[char_idx] == -1) {
            // Это первое вхождение символа - ставим открывающую скобку
            result[i] = '(';
            st.push(i);
            last_used[char_idx] = i;
        } else {
            // Это второе вхождение символа
            if (!st.empty() && s[st.top()] == s[i]) {
                // Можем закрыть последнюю открытую скобку с тем же символом
                result[i] = ')';
                st.pop();
                last_used[char_idx] = -1;
            } else {
                // Нужно поставить открывающую скобку
                result[i] = '(';
                st.push(i);
                last_used[char_idx] = i;
            }
        }
    }
    
    // Проверяем, что все скобки закрыты
    if (!st.empty()) {
        fout << -1 << endl;
        return 0;
    }
    
    // Дополнительная проверка: убедимся, что последовательность валидна
    // и удовлетворяет условию на символы
    stack<int> check;
    for (int i = 0; i < n; i++) {
        if (result[i] == '(') {
            check.push(i);
        } else {
            if (check.empty()) {
                fout << -1 << endl;
                return 0;
            }
            int open_idx = check.top();
            check.pop();
            if (s[open_idx] != s[i]) {
                fout << -1 << endl;
                return 0;
            }
        }
    }
    
    if (!check.empty()) {
        fout << -1 << endl;
        return 0;
    }
    
    fout << result << endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...