ICPC 国内予選2011B 世界の天秤 AOJ 1173
解法:やるだけ
list使おうと思ったがイテレーターの動きがおかしくやめる→しかたなくbool配列を使ってlistっぽくする→最近のC++でgetsが使えなくなってて泣く→ググってgetlineを見つけてAC
#include <bits/stdc++.h> #include <stdio.h> #define chmin(a, b) ((a)=min((a), (b))) #define chmax(a, b) ((a)=max((a), (b))) #define fs first #define sc second #define eb emplace_back using namespace std; typedef long long ll; typedef pair<int, int> P; //typedef tuple<int, int, int> T; const ll MOD=1e9+7; const ll INF=1e18; int dx[]={1, -1, 0, 0}; int dy[]={0, 0, 1, -1}; bool ch[150]; int num[150]; int main(){ while(true){ // char data[120]; string data; getline(cin,data); // gets(data); if(data[0] == '.') break; // int len = strlen(data); int len = data.length(); int sum = 0; for(int i = 0;i < len;i++){ int add = 0; switch(data[i]){ case '(': add = -1; break; case '[': add = -2; break; case ')': add = 1; break; case ']': add = 2; break; } if(add == 0)continue; ch[sum] = false; num[sum++] = add; } int ans = 1,max = sum; while(true){ if(sum % 2 != 0){ ans = 0; break;} if(sum == 0) break; int check = 0; for(int i = 1;i < sum;i++){ int a,b; int count = 0; for(int j = 0;j < max;j++){ if(ch[j] == false){ count++; if(count == i){ a = j; }else if(count == i+1){ b = j; break; } } } if(num[a] + num[b] == 0 && num[a] < num[b]){ ch[a] = true; ch[b] = true; sum -= 2; check = 1; break; } } if(check == 0){ ans = 0; break;} } if(ans == 1){ cout << "yes" << endl; }else{ cout << "no" << endl; } } }