# |
제출 시각 |
아이디 |
문제 |
언어 |
결과 |
실행 시간 |
메모리 |
740994 |
2023-05-13T11:12:18 Z |
이동현(#9959) |
괄호 문자열 (CEOI16_match) |
C++17 |
|
91 ms |
235084 KB |
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
using namespace std;
const int NS = (int)1e5 + 4;
string s;
int n;
int spa[NS][30][20];
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> s;
n = (int)s.size();
memset(spa, -1, sizeof(spa));
for(int i = n - 3; i >= 0; --i){
if(s[i] == s[i + 1]){
spa[i][s[i + 2] - 'a'][0] = i + 1;
continue;
}
int p = spa[i + 1][s[i] - 'a'][0];
if(p != -1 && p + 2 < n){
spa[i][s[p + 2] - 'a'][0] = p + 1;
}
}
for(int j = 0; j < 26; ++j){
for(int k = 1; k < 20; ++k){
for(int i = 0; i < n; ++i){
spa[i][j][k] = (spa[i][j][k - 1] == -1 ? -1 : spa[spa[i][j][k - 1] + 1][j][k - 1]);
}
}
}
string ans(n, '$');
priority_queue<int, vector<int>, greater<int>> pq;
for(int i = 0; i < n; ++i){
if(!pq.empty() && pq.top() <= i){
pq.pop();
continue;
}
int lim = n + 243;
if(!pq.empty()) lim = pq.top();
int now = i + 1;
for(int k = 19; k >= 0; --k){
if(spa[now][s[i] - 'a'][k] != -1 && spa[now][s[i] - 'a'][k] + 1 < lim){
now = spa[now][s[i] - 'a'][k];
}
}
++now;
if(s[i] == s[i + 1]) now = i + 1;
if(now >= lim){
cout << "-1\n";
return 0;
}
ans[i] = '(';
ans[now] = ')';
pq.push(now);
}
cout << ans << '\n';
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
91 ms |
235084 KB |
Output is correct |
2 |
Incorrect |
85 ms |
235048 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
91 ms |
235084 KB |
Output is correct |
2 |
Incorrect |
85 ms |
235048 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
91 ms |
235084 KB |
Output is correct |
2 |
Incorrect |
85 ms |
235048 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |