제출 #1115709

#제출 시각아이디문제언어결과실행 시간메모리
1115709bleahbleah괄호 문자열 (CEOI16_match)C++17
100 / 100
80 ms18592 KiB
#include <bits/stdc++.h> #define all(x) (x).begin(),(x).end() using namespace std; #define sz(x) ((int)(x).size()) const int nmax = 2e5 + 5; const int mod = 998244853; using ll = long long; struct Mint { int val; Mint(ll x = 0): val((x % mod + mod) % mod) {;} Mint operator +(const Mint& x) const { return Mint(val + x.val); } Mint operator -(const Mint& x) const { return Mint(val - x.val); } Mint operator *(const Mint& x) const { return Mint((ll)val * x.val); } Mint operator +=(const Mint& x) { return *this = Mint(val + x.val); } Mint operator -=(const Mint& x) { return *this = Mint(val - x.val); } Mint operator *=(const Mint& x) { return *this = Mint((ll)val * x.val); } Mint operator ^(int b) const { Mint accum = 1, a = *this; while(b) { accum = (b & 1? accum * a : accum); a *= a; b >>= 1; } return accum; } Mint operator /(const Mint& x) { return Mint((ll)val * (x ^ (mod - 2)).val); } Mint operator /=(const Mint& x) { return *this = Mint((ll)val * (x ^ (mod - 2)).val); } }; Mint p[nmax][2]; struct hsh { Mint v[2]; int len; hsh() { v[0] = v[1] = len = 0; } hsh(int a) { v[0] = v[1] = a; len = 1; } hsh(Mint a, Mint b, int c) { v[0] = a; v[1] = b; len = c; } hsh operator +(const hsh& x) const { return hsh(v[0] * p[0][x.len] + x.v[0], v[1] * p[1][x.len] + x.v[1], len + x.len); } ll operator ()() const { return v[0].val * mod + v[1].val; } bool operator < (const hsh& x) const { return (*this)() < x(); } }; hsh level[nmax]; void initlevels(string s) { vector<int> st; vector<hsh> pref; pref.emplace_back(hsh()); for(int i = 1; i < sz(s); i++) { if(sz(st) == 0 || st.back() != s[i]) st.emplace_back(s[i]), pref.emplace_back(pref.back() + hsh(s[i])); else st.pop_back(), pref.pop_back(); level[i] = pref.back(); } if(sz(st) != 0) { cout << "-1\n"; exit(0); } return; } map<hsh, set<int>> atr[256]; int getprev(int x, const set<int>& s) { auto it = s.lower_bound(x); if(it == s.begin()) return -1; return *prev(it); } signed main() { { mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); p[0][0] = p[0][1] = 1; p[1][0] = rng() % (mod - 500) + 100; p[1][1] = rng() % (mod - 502) + 99; for(int i = 2; i < nmax; i++) p[i][0] = p[i - 1][0] * p[1][0], p[i][1] = p[i - 1][1] * p[1][1]; } string s; cin >> s; s = "$" + s; initlevels(s); for(int i = 1; i < sz(s); i++) { atr[s[i]][level[i - 1]].emplace(i); } vector<int> st; vector<int> idx; vector<int> invidx; invidx.emplace_back(sz(s) + 1); string rez = ""; for(int i = 1; i < sz(s); i++) { int ch = s[i]; // cerr << i << '\t' << (char)ch << '\n'; if(invidx.back() == i) { rez += ')'; st.pop_back(); idx.pop_back(); invidx.pop_back(); } else if(sz(st) == 0 || st.back() != ch) { rez += '('; st.emplace_back(ch); idx.emplace_back(i); invidx.emplace_back(getprev(invidx.back(), atr[ch][level[i]])); assert(idx.back() < invidx.back()); } else { st.emplace_back(ch); idx.emplace_back(i); invidx.emplace_back(getprev(invidx.back(), atr[ch][level[i]])); if(idx.back() < invidx.back()) rez += '('; else { rez += ')'; idx.pop_back(); idx.pop_back(); st.pop_back(); st.pop_back(); invidx.pop_back(); invidx.pop_back(); } } } cout << rez << '\n'; }

컴파일 시 표준 에러 (stderr) 메시지

match.cpp: In function 'int main()':
match.cpp:92:11: warning: array subscript has type 'char' [-Wchar-subscripts]
   92 |   atr[s[i]][level[i - 1]].emplace(i);
      |           ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...