제출 #90643

#제출 시각아이디문제언어결과실행 시간메모리
90643jangwonyoung괄호 문자열 (CEOI16_match)C++14
100 / 100
37 ms7412 KiB
#include<iostream> #include<stack> #include<set> using namespace std; string s,b; int n; int f[100001]; stack<char>st; stack<int>cut; set<pair<int,int> >g[226]; int par[100001]; int find(int x){ if(par[x]!=x) par[x]=find(par[x]); return par[x]; } void join(int u,int v){ u=find(u);v=find(v); par[u]=v; } int main(){ ios::sync_with_stdio(false); cin >> s; b=s; n=s.size(); par[n]=n; for(int i=0; i<n ;i++){ par[i]=i; if(st.empty() || st.top()!=s[i]) st.push(s[i]); else st.pop(); } if(!st.empty()){ cout << "-1\n"; return 0; } for(int i=n-1; i>=0 ;i--){ f[i]=-1; int en=i+1; while(en<n && en>=0){ if(s[i]==s[en]){ f[i]=en+1; break; } en=f[en]; } } for(int i=0; i<n ;i++){ if(f[i]!=-1) join(i,f[i]); } for(int i=0; i<n ;i++){ g[s[i]].insert({find(i+1),i}); } cut.push(n); for(int i=0; i<n ;i++){ if(i==cut.top()){ cut.pop(); continue; } pair<int,int>tmp={find(i),cut.top()}; auto it=g[s[i]].lower_bound(tmp); --it; b[i]='('; b[it->second]=')'; cut.push(it->second); g[s[i]].erase(it); } cout << b << endl; }

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

match.cpp: In function 'int main()':
match.cpp:50:9: warning: array subscript has type 'char' [-Wchar-subscripts]
   g[s[i]].insert({find(i+1),i});
         ^
match.cpp:59:17: warning: array subscript has type 'char' [-Wchar-subscripts]
   auto it=g[s[i]].lower_bound(tmp);
                 ^
match.cpp:64:9: warning: array subscript has type 'char' [-Wchar-subscripts]
   g[s[i]].erase(it);
         ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...