제출 #1293898

#제출 시각아이디문제언어결과실행 시간메모리
1293898saidshikhov괄호 문자열 (CEOI16_match)C++20
0 / 100
0 ms332 KiB
#include <iostream> #include <fstream> #include <vector> #include <string> #include <stack> 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> cnt(26, 0); for (char c : s) { cnt[c - 'a']++; } for (int i = 0; i < 26; i++) { if (cnt[i] % 2 != 0) { fout << -1 << endl; return 0; } } string res(n, '.'); stack<int> st; vector<int> last_pos(26, -1); for (int i = 0; i < n; i++) { int c = s[i] - 'a'; if (last_pos[c] == -1) { // Первое вхождение символа - пробуем поставить '(' res[i] = '('; st.push(i); last_pos[c] = i; } else { // Второе вхождение символа if (!st.empty() && st.top() == last_pos[c]) { // Можем закрыть именно парную скобку res[i] = ')'; st.pop(); last_pos[c] = -1; } else { // Не можем закрыть - ставим '(' res[i] = '('; st.push(i); last_pos[c] = i; } } } // Проверка валидности stack<int> check; for (int i = 0; i < n; i++) { if (res[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 << res << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...