Problem:
Problem D: Cheat Case
Problem
算数のテストを受けることになった俺達は、今から勉強しても赤点を取ってしまうことを確信し、カンニングで乗り切ることを決意した。
算数のテスト問題を作成するA先生はテスト用紙を手書きで作ることで知られている。彼がテスト問題を作成している時の筆跡情報を、近所の博士に作ってもらった筆跡盗聴鉛筆で盗み取る作戦だ。だが肝心の筆跡情報から問題を復元するプログラムは博士の技術では作ることができなかった。しかも、たとえ問題が復元できたとしても、俺達の頭脳では問題を解くことができない。どうすることもできなくなった俺達は、プログラマーであるあなたに、筆跡情報から問題を復元し、それを解くプログラムの作成を依頼することにした。
今回のテストでは、数式を解く問題が出題される。数式中の演算記号は＋（加算）,-（減算）,・（乗算）の3つのみで、乗算は加算、減算よりも優先して計算される。数式は必ず構文が正しいものが与えられる。また、0以外の数で、先頭が0であるものは与えられない。
問題が書かれる紙はグリッドで表される。筆跡情報は線分の集合で与えられ、各線分はX軸に水平または垂直、もしくは始点、終点が同じ（点）である。この線分は、始点から終点までにあるマスを黒く塗りつぶすことを表す。座標(0, 0)が紙の左上である。数式の各文字（0,1,2,3,4,5,6,7,8,9,＋,-,・）は以下で表される。
0
1
2
3
4
5
6
7
8
9
＋
-
・
A先生は印刷したかのような字を書くことで知られており、各文字は上記以外の書かれ方はしない。また、上記以外の文字が書かれることはない。2つ以上の文字がマスの辺を共有することはない。各文字の位置は、文字を構成するマス（黒いマス）の中で、最も左側にあるもののX座標で表される。数式の文字は、位置が小さい順に（左から右へ）解釈される。2つ以上の文字の位置が等しくなることはない。
Input
N
X
11
Y
11
X
12
Y
12
X
21
Y
21
X
22
Y
22
:
X
N1
Y
N1
X
N2
Y
N2
1行目に線分の数を表す1つの整数
N
が与えられる。次に線分の情報が
N
行で与えられる。線分の情報の
i
行目には4つの整数
X
i1
,
Y
i1
,
X
i2
,
Y
i2
が空白区切りで与えられる。それぞれ、線分の1つ目の端点のX座標、Y座標、2つ目の端点のX座標、Y座標を表す。
Constraints
入力は以下の条件を満たす。
1 ≤
N
≤ 150
0 ≤
X
i1
,
Y
i1
,
X
i2
,
Y
i2
≤ 200 (1 ≤
i
≤
N
)
X
i1
=
X
i2
または
Y
i1
=
Y
i2
(1 ≤
i
≤
N
)
計算の途中と結果に現れる数は符号付き32ビット整数に収まる
Output
各ケースの計算結果を一行に出力せよ。
Sample Input 1
4
1 1 1 5
3 3 5 3
4 2 4 4
7 1 7 5
Sample Output 1
2
Sample Input 2
23
1 1 3 1
3 1 3 3
3 3 1 3
1 3 1 5
1 5 3 5
5 2 7 2
7 2 7 4
7 4 5 4
5 4 5 6
5 6 7 6
11 4 13 4
13 0 15 0
15 0 15 4
18 2 18 2
21 5 23 5
21 5 21 7
21 7 23 7
23 7 23 9
23 9 21 9
24 0 26 0
24 0 24 4
24 4 26 4
26 0 26 4
Sample Output 2
-328
Hint
1つのグリッドを2度以上塗りつぶすことがある
'1'など、1つの線分で表すことが可能でも、2つ以上の線分で表す場合がある
Sample Input 1の数式。
Sample Input 2の数式。"-7"の部分のように、ある文字を覆う最小の長方形の内部に別の文字が入り込む場合がある。

Submitted solutions:

code_snippet: #include <iostream>
#include <algorithm>
#include <vector>
#include <cassert>
using namespace std;
typedef pair<int,int> P;

namespace NS {
  string s;
  int p;
  int exp();
  int term();
  int fact();
  
  int exp() {
    int x = term();
    while(s[p] == '+' || s[p] == '-') {
      if(s[p] == '+') {
        ++p;
        x += term();
      } else {
        ++p;
        x -= term();
      }
    }
    return x;
  }
  
  int term() {
    int x = fact();
    while(s[p] == '*') {
      ++p;
      x *= fact();
    }
    return x;
  }
  
  int fact() {
    string num = "";
    while(isdigit(s[p])) {
      num += s[p++];
    }
    return atoi(num.c_str());
  }
}

int parse(string s) {
  NS::s = s + "$";
  NS::p = 0;
  int res = NS::exp();
  assert(NS::p+1 == NS::s.size());
  return res;
}


const int MAXH = 221;
const int MAXW = 221;
const int MH = 7;
const int MW = 5;
int N;
char G[MAXH][MAXW];


const string F[13][MH] = {
  {
    ".....",
    ".###.",
    ".#.#.",
    ".#.#.",
    ".#.#.",
    ".###.",
    "....."
  },
  {
    ".....",
    ".#...",
    ".#...",
    ".#...",
    ".#...",
    ".#...",
    "....."
  },
  {
    ".....",
    ".###.",
    "...#.",
    ".###.",
    ".#...",
    ".###.",
    "....."
  },
  {
    ".....",
    ".###.",
    "...#.",
    ".###.",
    "...#.",
    ".###.",
    "....."
  },
  {
    ".....",
    ".#.#.",
    ".#.#.",
    ".###.",
    "...#.",
    "...#.",
    "....."
  },
  {
    ".....",
    ".###.",
    ".#...",
    ".###.",
    "...#.",
    ".###.",
    "....."
  },
  {
    ".....",
    ".###.",
    ".#...",
    ".###.",
    ".#.#.",
    ".###.",
    "....."
  },
  {
    ".....",
    ".###.",
    "...#.",
    "...#.",
    "...#.",
    "...#.",
    "....."
  },
  {
    ".....",
    ".###.",
    ".#.#.",
    ".###.",
    ".#.#.",
    ".###.",
    "....."
  },
  {
    ".....",
    ".###.",
    ".#.#.",
    ".###.",
    "...#.",
    ".###.",
    "....."
  },
  {
    ".....",
    ".....",
    "..#..",
    ".###.",
    "..#..",
    ".....",
    "....."
  },
  {
    ".....",
    ".....",
    ".....",
    ".###.",
    ".....",
    ".....",
    "....."
  },
  {
    ".....",
    ".....",
    ".....",
    ".#...",
    ".....",
    ".....",
    "....."
  }
};

void show(int w = 101, int h = 101) {
  for(int i = 0; i < h; ++i) {
    for(int j = 0; j < w; ++j) {
      cout << G[i][j];
    }
    cout << endl;
  }
}

int main() {
  cin >> N;
  fill(G[0], G[MAXH], '.');
  for(int k = 0; k < N; ++k) {
    int a, b, c, d;
    cin >> a >> b >> c >> d;
    if(b == d) {
      for(int i = min(a,c); i <= max(a,c); ++i) G[10+b][10+i] = '#';
    } else {
      for(int i = min(b,d); i <= max(b,d); ++i) G[10+i][10+a] = '#';
    }
  }

  vector<pair<int,int> > id;
  for(int k = 0; k < 13; ++k) {
    pair<int,int> p(0, k);
    for(int a = 0; a < MH; ++a) {
      for(int b = 0; b < MW; ++b) {
        p.first -= F[k][a][b] == '#';
      }
    }
    id.push_back(p);
  }
  sort(id.begin(), id.end());

  vector<pair<int,int> > v;
  for(int t = 0; t < 13; ++t) {
    int k = id[t].second;
    for(int i = 0; i+MH <= MAXH; ++i) {
      for(int j = 0; j+MW <= MAXW; ++j) {
        try {
          for(int a = 0; a < MH; ++a) {
            for(int b = 0; b < MW; ++b) {
              if(G[i+a][j+b] == '.' && F[k][a][b] == '#') throw 0;
            }
          }
          for(int a = 0; a < MH; ++a) {
            for(int b = 0; b < MW; ++b) {
              if(F[k][a][b] == '#') G[i+a][j+b] = '.';
            }
          }
          v.push_back(make_pair(j, k));
        } catch(...) {}
      }
    }
  }

  sort(v.begin(), v.end());
  
  string s;
  for(int i = 0; i < v.size(); ++i) {
    if(v[i].second == 10) {
      s += '+';
    } else if(v[i].second == 11) {
      s += '-';
    } else if(v[i].second == 12) {
      s += '*';
    } else {
      s += '0'+v[i].second;
    }
  }
  //cout << s << endl;
  cout << parse(s) << endl;
  return 0;
}
accuracy: 1
time_ms: 850
memory_kb: 1348
final_rank: 1

code_snippet: #include<iostream>
#include <string>
#include <algorithm>
using namespace std;


string ume_c="89605+32471-*";
string ume[13][5]={
    {//8
    "111",
    "101",
    "111",
	"101",
    "111"
    },

	{
    "111",
    "101",
    "111",
	"001",
    "111"
    },
	
	{
    "111",
    "100",
    "111",
	"101",
    "111"
    },
	
	{
    "111",
    "101",
    "101",
	"101",
    "111"
    },
	
	{
    "111",
    "100",
    "111",
	"001",
    "111"
    },
	
	{
    "000",
    "010",
    "111",
	"010",
    "000"
    },
	
	{
    "111",
    "001",
    "111",
	"001",
    "111"
    },
	
	{
    "111",
    "001",
    "111",
	"100",
    "111"
    },
	
	{
    "101",
    "101",
    "111",
	"001",
    "001"
    },
	
	{
    "111",
    "001",
    "001",
	"001",
    "001"
    },
	{
    "001",
    "001",
    "001",
	"001",
    "001"
    },
	{
    "000",
    "000",
    "111",
	"000",
    "000"
    },
	{
    "000",
    "000",
    "010",
	"000",
    "000"
    }
	
	
};


string S;
int pos;

int expr();
int term();
int num();

int expr(){
	int res = term();
	while(1){
		if(S[pos]=='+'){
			pos++;
			res += term();
		}else if(S[pos]=='-'){
			pos++;
			res -= term();
		}else{
			break;
		}
	}
	return res;
}

int term(){
	int res = num();
	while(1){
		if(S[pos]=='*'){
			pos++;
			res *= num();
		}else{
			break;
		}
	}
	return res;
}

int num(){
	int c = S[pos++]-'0';
	while('0' <= S[pos] && S[pos] <= '9'){
		c *= 10;
		c += S[pos++]-'0';
	}
	return c;
}

int main(){
	int n;
	cin>>n;
	int mp[321][321]={0};
	char s[322]={};
	for(int i=0;i<321;i++)s[i]=' ';
	
	for(int i=0;i<n;i++){
		int x1,y1,x2,y2;
		cin>>x1>>y1>>x2>>y2;
		x1 += 20;
		y1 += 20;
		x2 += 20;
		y2 += 20;
		
		if(x1==x2){
			if( y1 > y2 ) swap(y1,y2);
			for(int j=y1;j<=y2;j++){
				mp[x1][j]=1;
			}
		}else{
			if( x1 > x2 ) swap(x1,x2);
			for(int j=x1;j<=x2;j++){
				mp[j][y1]=1;
			}
		}
	}
	for(int i=0;i<ume_c.size();i++){
		for(int j=0;j<=300;j++){
			for(int k=0;k<=300;k++){
				int t=1;
				int minx = 1e9;
				for(int l=0;l<=4;l++){
					for(int m=0;m<=2;m++){
						if(ume[i][l][m]=='1'){
							minx = min(minx,k+m);
							if(mp[k+m][j+l]==0){
								
								t=0;
							}
						}
					}
				}
				if(t==1){
					s[minx]=ume_c[i];
					for(int l=0;l<=4;l++){
						for(int m=0;m<=2;m++){
							if(ume[i][l][m]=='1'){
								mp[k+m][j+l]=0;
							}
						}
					}
				}
			}
		}
	}
	S = string(s);
	S.erase(remove(S.begin(),S.end(),' '),S.end());
	pos = 0;
	S += "~";
	cout<<expr()<<endl;
}
accuracy: 1
time_ms: 40
memory_kb: 1632
final_rank: 2

code_snippet: #include<iostream>
#include <string>
#include <algorithm>
using namespace std;


string ume_c="89605+32471-*";
string ume[13][5]={
    {//8
    "111",
    "101",
    "111",
	"101",
    "111"
    },

	{
    "111",
    "101",
    "111",
	"001",
    "111"
    },
	
	{
    "111",
    "100",
    "111",
	"101",
    "111"
    },
	
	{
    "111",
    "101",
    "101",
	"101",
    "111"
    },
	
	{
    "111",
    "100",
    "111",
	"001",
    "111"
    },
	
	{
    "000",
    "010",
    "111",
	"010",
    "000"
    },
	
	{
    "111",
    "001",
    "111",
	"001",
    "111"
    },
	
	{
    "111",
    "001",
    "111",
	"100",
    "111"
    },
	
	{
    "101",
    "101",
    "111",
	"001",
    "001"
    },
	
	{
    "111",
    "001",
    "001",
	"001",
    "001"
    },
	{
    "001",
    "001",
    "001",
	"001",
    "001"
    },
	{
    "000",
    "000",
    "111",
	"000",
    "000"
    },
	{
    "000",
    "000",
    "010",
	"000",
    "000"
    }
	
	
};


string S;
int pos;

int expr();
int term();
int num();

int expr(){
	int res = term();
	while(1){
		if(S[pos]=='+'){
			pos++;
			res += term();
		}else if(S[pos]=='-'){
			pos++;
			res -= term();
		}else{
			break;
		}
	}
	return res;
}

int term(){
	int res = num();
	while(1){
		if(S[pos]=='*'){
			pos++;
			res *= num();
		}else{
			break;
		}
	}
	return res;
}

int num(){
	int c = S[pos++]-'0';
	while('0' <= S[pos] && S[pos] <= '9'){
		c *= 10;
		c += S[pos++]-'0';
	}
	return c;
}

int main(){
	int n;
	cin>>n;
	int mp[321][321]={0};
	char s[322]={};
	for(int i=0;i<321;i++)s[i]=' ';
	
	for(int i=0;i<n;i++){
		int x1,y1,x2,y2;
		cin>>x1>>y1>>x2>>y2;
		x1 += 20;
		y1 += 20;
		x2 += 20;
		y2 += 20;
		
		if(x1==x2){
			if( y1 > y2 ) swap(y1,y2);
			for(int j=y1;j<=y2;j++){
				mp[x1][j]=1;
			}
		}else{
			if( x1 > x2 ) swap(x1,x2);
			for(int j=x1;j<=x2;j++){
				mp[j][y1]=1;
			}
		}
	}
	for(int i=0;i<ume_c.size();i++){
		for(int j=0;j<=300;j++){
			for(int k=0;k<=300;k++){
				int t=1;
				for(int l=0;l<=4;l++){
					for(int m=0;m<=2;m++){
						if(ume[i][l][m]=='1'){
							if(mp[k+m][j+l]==0){
								t=0;
							}
						}
					}
				}
				if(t==1){
					s[k]=ume_c[i];
					for(int l=0;l<=4;l++){
						for(int m=0;m<=2;m++){
							if(ume[i][l][m]=='1'){
								mp[k+m][j+l]=0;
							}
						}
					}
				}
			}
		}
	}
	S = string(s);
	S.erase(remove(S.begin(),S.end(),' '),S.end());
	pos = 0;
	cout<<expr()<<endl;
}
accuracy: 0.8888888888888888
time_ms: 40
memory_kb: 1628
final_rank: 4

code_snippet: #include<iostream>
#include <string>
#include <algorithm>
using namespace std;


string ume_c="89605+32471-*";
string ume[13][5]={
    {//8
    "111",
    "101",
    "111",
	"101",
    "111"
    },

	{
    "111",
    "101",
    "111",
	"001",
    "111"
    },
	
	{
    "111",
    "100",
    "111",
	"101",
    "111"
    },
	
	{
    "111",
    "101",
    "101",
	"101",
    "111"
    },
	
	{
    "111",
    "100",
    "111",
	"001",
    "111"
    },
	
	{
    "000",
    "010",
    "111",
	"010",
    "000"
    },
	
	{
    "111",
    "001",
    "111",
	"001",
    "111"
    },
	
	{
    "111",
    "001",
    "111",
	"100",
    "111"
    },
	
	{
    "101",
    "101",
    "111",
	"001",
    "001"
    },
	
	{
    "111",
    "001",
    "001",
	"001",
    "001"
    },
	{
    "001",
    "001",
    "001",
	"001",
    "001"
    },
	{
    "000",
    "000",
    "111",
	"000",
    "000"
    },
	{
    "000",
    "000",
    "010",
	"000",
    "000"
    }
	
	
};


string S;
int pos;

int expr();
int term();
int num();

int expr(){
	int res = term();
	while(1){
		if(S[pos]=='+'){
			pos++;
			res += term();
		}else if(S[pos]=='-'){
			pos++;
			res -= term();
		}else{
			break;
		}
	}
	return res;
}

int term(){
	int res = num();
	while(1){
		if(S[pos]=='*'){
			pos++;
			res *= num();
		}else{
			break;
		}
	}
	return res;
}

int num(){
	int c = S[pos++]-'0';
	while('0' <= S[pos] && S[pos] <= '9'){
		c *= 10;
		c += S[pos++]-'0';
	}
	return c;
}

int main(){
	int n;
	cin>>n;
	int mp[321][321]={0};
	char s[321];
	for(int i=0;i<321;i++)s[i]=' ';
	
	for(int i=0;i<n;i++){
		int x1,y1,x2,y2;
		cin>>x1>>y1>>x2>>y2;
		x1 += 20;
		y1 += 20;
		x2 += 20;
		y2 += 20;
		
		if(x1==x2){
			if( y1 > y2 ) swap(y1,y2);
			for(int j=y1;j<=y2;j++){
				mp[x1][j]=1;
			}
		}else{
			if( x1 > x2 ) swap(x1,x2);
			for(int j=x1;j<=x2;j++){
				mp[j][y1]=1;
			}
		}
	}
	for(int i=0;i<ume_c.size();i++){
		for(int j=0;j<=300;j++){
			for(int k=0;k<=300;k++){
				int t=1;
				for(int l=0;l<=4;l++){
					for(int m=0;m<=2;m++){
						if(ume[i][l][m]=='1'){
							if(mp[k+m][j+l]==0){
								t=0;
							}
						}
					}
				}
				if(t==1){
					s[k]=ume_c[i];
					for(int l=0;l<=4;l++){
						for(int m=0;m<=2;m++){
							if(ume[i][l][m]=='1'){
								mp[k+m][j+l]=0;
							}
						}
					}
				}
			}
		}
	}
	S = string(s);
	S.erase(remove(S.begin(),S.end(),' '),S.end());
	pos = 0;
	cout<<expr()<<endl;
}
accuracy: 0.8888888888888888
time_ms: 50
memory_kb: 1628
final_rank: 5

code_snippet: #include<iostream>
#include <string>
#include <algorithm>
using namespace std;


string ume_c="89605+32471-*";
string ume[13][5]={
    {//8
    "111",
    "101",
    "111",
	"101",
    "111"
    },

	{
    "111",
    "101",
    "111",
	"001",
    "111"
    },
	
	{
    "111",
    "100",
    "111",
	"101",
    "111"
    },
	
	{
    "111",
    "101",
    "101",
	"101",
    "111"
    },
	
	{
    "111",
    "100",
    "111",
	"001",
    "111"
    },
	
	{
    "000",
    "010",
    "111",
	"010",
    "000"
    },
	
	{
    "111",
    "001",
    "111",
	"001",
    "111"
    },
	
	{
    "111",
    "001",
    "111",
	"100",
    "111"
    },
	
	{
    "101",
    "101",
    "111",
	"001",
    "001"
    },
	
	{
    "111",
    "001",
    "001",
	"001",
    "001"
    },
	{
    "001",
    "001",
    "001",
	"001",
    "001"
    },
	{
    "000",
    "000",
    "111",
	"000",
    "000"
    },
	{
    "000",
    "000",
    "010",
	"000",
    "000"
    }
	
	
};


string S;
int pos;

int expr();
int term();
int num();

int expr(){
	int res = term();
	while(1){
		if(S[pos]=='+'){
			pos++;
			res += term();
		}else if(S[pos]=='-'){
			pos++;
			res -= term();
		}else{
			break;
		}
	}
	return res;
}

int term(){
	int res = num();
	while(1){
		if(S[pos]=='*'){
			pos++;
			res *= num();
		}else{
			break;
		}
	}
	return res;
}

int num(){
	int c = S[pos++]-'0';
	while('0' <= S[pos] && S[pos] <= '9'){
		c *= 10;
		c += S[pos++]-'0';
	}
	return c;
}

int main(){
	int n;
	cin>>n;
	int mp[221][221]={0};
	char s[221];
	for(int i=0;i<221;i++)s[i]=' ';
	
	for(int i=0;i<n;i++){
		int x1,y1,x2,y2;
		cin>>x1>>y1>>x2>>y2;
		x1 += 20;
		y1 += 20;
		x2 += 20;
		y2 += 20;
		
		if(x1==x2){
			if( y1 > y2 ) swap(y1,y2);
			for(int j=y1;j<=y2;j++){
				mp[x1][j]=1;
			}
		}else{
			if( x1 > x2 ) swap(x1,x2);
			for(int j=x1;j<=x2;j++){
				mp[j][y1]=1;
			}
		}
	}
	for(int i=0;i<ume_c.size();i++){
		for(int j=0;j<=216;j++){
			for(int k=0;k<=218;k++){
				int t=1;
				for(int l=0;l<=4;l++){
					for(int m=0;m<=2;m++){
						if(ume[i][l][m]=='1'){
							if(mp[k+m][j+l]==0){
								t=0;
							}
						}
					}
				}
				if(t==1){
					s[k]=ume_c[i];
					for(int l=0;l<=4;l++){
						for(int m=0;m<=2;m++){
							if(ume[i][l][m]=='1'){
								mp[k+m][j+l]=0;
							}
						}
					}
				}
			}
		}
	}
	S = string(s);
	S.erase(remove(S.begin(),S.end(),' '),S.end());
	pos = 0;
	cout<<expr()<<endl;
}
accuracy: 0.8888888888888888
time_ms: 20
memory_kb: 1416
final_rank: 3

code_snippet: #include<iostream>
#include <string>
#include <algorithm>
using namespace std;


string ume_c="89605+32471-*";
string ume[13][5]={
    {//8
    "111",
    "101",
    "111",
	"101",
    "111"
    },

	{
    "111",
    "101",
    "111",
	"001",
    "111"
    },
	
	{
    "111",
    "100",
    "111",
	"101",
    "111"
    },
	
	{
    "111",
    "101",
    "101",
	"101",
    "111"
    },
	
	{
    "111",
    "100",
    "111",
	"001",
    "111"
    },
	
	{
    "000",
    "010",
    "111",
	"010",
    "000"
    },
	
	{
    "111",
    "001",
    "111",
	"001",
    "111"
    },
	
	{
    "111",
    "001",
    "111",
	"100",
    "111"
    },
	
	{
    "101",
    "101",
    "111",
	"001",
    "001"
    },
	
	{
    "111",
    "001",
    "001",
	"001",
    "001"
    },
	{
    "001",
    "001",
    "001",
	"001",
    "001"
    },
	{
    "000",
    "000",
    "111",
	"000",
    "000"
    },
	{
    "000",
    "000",
    "010",
	"000",
    "000"
    }
	
	
};


string S;
int pos;

int expr();
int term();
int num();

int expr(){
	int res = term();
	while(1){
		if(S[pos]=='+'){
			pos++;
			res += term();
		}else if(S[pos]=='-'){
			pos++;
			res -= term();
		}else{
			break;
		}
	}
	return res;
}

int term(){
	int res = num();
	while(1){
		if(S[pos]=='*'){
			pos++;
			res *= num();
		}else{
			break;
		}
	}
	return res;
}

int num(){
	int c = S[pos++]-'0';
	while('0' <= S[pos] && S[pos] <= '9'){
		c *= 10;
		c += S[pos++]-'0';
	}
	return c;
}

int main(){
	int n;
	cin>>n;
	int flag[201][201]={0};
	int mp[221][221]={0};
	char s[201];
	for(int i=0;i<201;i++)s[i]=' ';
	
	for(int i=0;i<n;i++){
		int x1,y1,x2,y2;
		cin>>x1>>y1>>x2>>y2;
		x1 += 20;
		y1 += 20;
		x2 += 20;
		y2 += 20;
		
		if(x1==x2){
			if( y1 > y2 ) swap(y1,y2);
			for(int j=y1;j<=y2;j++){
				mp[x1][j]=1;
			}
		}else{
			if( x1 > x2 ) swap(x1,x2);
			for(int j=x1;j<=x2;j++){
				mp[j][y1]=1;
			}
		}
	}
	for(int i=0;i<ume_c.size();i++){
		for(int j=0;j<=216;j++){
			for(int k=0;k<=218;k++){
				int t=1;
				for(int l=0;l<=4;l++){
					for(int m=0;m<=2;m++){
						if(ume[i][l][m]=='1'){
							if(mp[k+m][j+l]==0){
								t=0;
							}
						}
					}
				}
				if(t==1){
					s[k]=ume_c[i];
					for(int l=0;l<=4;l++){
						for(int m=0;m<=2;m++){
							if(ume[i][l][m]=='1'){
								mp[k+m][j+l]=0;
							}
						}
					}
				}
			}
		}
	}
	S = string(s);
	S.erase(remove(S.begin(),S.end(),' '),S.end());
	pos = 0;
	cout<<expr()<<endl;
}
accuracy: 0.5185185185185185
time_ms: 30
memory_kb: 1416
final_rank: 6