#include #include #include using namespace std; #define NONE -1 #define MAXN 3000 int bracketType[256]; bool bracketClosing[256]; char opening[256]; int N; char s[MAXN+5]; void init() { scanf("%s", s); N = strlen(s); for(int i=0; i<256; i++) bracketType[i]=NONE; char br[10]="([{<>}])"; bool cl[8]={false,false,false,false,true,true,true,true}; int t[8]={0,1,2,3,3,2,1,0}; for(int i=0; i<8; i++) { bracketType[br[i]] = t[i]; bracketClosing[br[i]] = cl[i]; } for(int i=4; i<8; i++) { //printf("%c :: %c\n", br[i], br[8-i-1]); opening[br[i]] = br[8-i-1]; } } int cnt[MAXN][4]; bool different(int a, int b) { for(int i=0; i<4; i++) if(cnt[a][i] != cnt[b][i]) return true; return false; } bool valid() { int t; stack br[4]; for(int i=0; i0) for(int j=0; j<4; j++) cnt[i][j] = cnt[i-1][j]; if(bracketType[s[i]] != NONE) { if(bracketClosing[s[i]]) { if(cnt[i][bracketType[s[i]]] == 0) return false; t = br[bracketType[s[i]]].top(); br[bracketType[s[i]]].pop(); if(different(t, i)) return false; cnt[i][bracketType[s[i]]]--; } else { br[bracketType[s[i]]].push(i); cnt[i][bracketType[s[i]]]++; } } } for(int i=0; i<4; i++) if(cnt[N-1][i] != 0) return false; return true; } int main() { freopen("brackets.in", "r", stdin); freopen("brackets.out", "w", stdout); init(); printf("%d\n", valid()); return 0; }