Language: C++

#include<stdio.h>

struct make
{
	char str;
	int posi,start[2];
	int high,wide,JUDGE;//JUDGE==1で長方形,==0で長方形以外,==2で未定
	struct make *front;
};


int main()
{
	int N,H,W,count,COUNT,judge,no_rect,NO_RECT;
	char img[1000][51],RECT[8];
	struct make M[8];
	int s1,s2,num;
	
	scanf("%d",&N);//データの個数
	for(int a=0;a<N;a++)
	{
		count=0;//材質の個数
		COUNT=0;
		NO_RECT=0;
		scanf("%d %d",&H,&W);
		for(int b=0;b<H;b++)
		{
			scanf("%s",img[b]);
			img[b][W]='\0';
		}
		for(int b=0;b<H;b++)
		{
			for(int d=0;d<count;d++) M[d].posi=-1;
			for(int c=0;c<W;c++)
			{
				if(img[b][c]!='.')
				{
					//材質判定
					judge=0;
					do
					{
						if(count>0 && img[b][c]!=M[judge].str) judge++;
						else break;
					}while(judge<count);
					//新しい材質の場合
					if(judge==count)
					{
						M[count].str=img[b][c];
						M[count].start[0]=b;
						M[count].start[1]=c;
						M[count].posi=c;
						M[count].high=1;
						M[count].wide=1;
						M[count].JUDGE=0;
						count++;
					}
					//既出の材質の場合
					else
					{
						if(M[judge].start[1]>c) M[judge].start[1]=c;
						if(M[judge].posi<0) M[judge].posi=c;
						else if(M[judge].wide<c-M[judge].posi+1) M[judge].wide=c-M[judge].posi+1;
						M[judge].high=b-M[judge].start[0]+1;
					}
				}
			}
		}
		no_rect=count;
		//printf("count=%d\n",count);
		//判定開始
		while(count)//文字アリ
		{
			COUNT=0;
			//見えている部分が長方形かどうか判定
			for(num=0;num<count;num++)
			{
				
				if(M[num].JUDGE==1) continue;
				M[num].JUDGE=0;//長方形なら
				//printf("M[%d].str=%c\nM[%d].high=%d\nM[%d].wide=%d\n",num,M[num].str,num,M[num].high,num,M[num].wide);
				//printf("M[%d].start[0]=%d\nM[%d].start[1]=%d\n",num,M[num].start[0],num,M[num].start[1]);
				for(s1=0;s1<M[num].high;s1++)
				{
					for(s2=0;s2<M[num].wide;s2++)
					{
						//確実に長方形ではない場合
						if(img[s1+M[num].start[0]][s2+M[num].start[1]]=='.')
						{
							NO_RECT=1;
							break;
						}
						//長方形の可能性もある場合
						if(img[s1+M[num].start[0]][s2+M[num].start[1]]!=M[num].str)
						{
							for(int r=0;r<count-no_rect;)
							{
								if(img[s1+M[num].start[0]][s2+M[num].start[1]]==RECT[r]) break;
								r++;
								if(r==count-no_rect)
								{
									M[num].JUDGE=2;
									COUNT++;
									break;
								}
						}
						if(NO_RECT || M[num].JUDGE==2) break;
					}
					if(NO_RECT || M[num].JUDGE==2) break;
				}
				if(NO_RECT) break;
				//長方形だった場合
				if(s1==M[num].high && s2==M[num].wide)
				{
					M[num].JUDGE=1;
					no_rect--;
					M[num].front=NULL;
					RECT[num]=M[num].str;
				}
				//printf("M[%d].JUDGE=%d\n\n",num,M[num].JUDGE);
			}
			for(int n=0;n<num;)
			{
				if(M[num].JUDGE!=2 && M[num].JUDGE!=1) break;
				n++;
				//どれも長方形ではなかった場合
				if(n==num) NO_RECT=1;
			}
			
			//printf("NO_RECT=%d\n",NO_RECT);
			if(NO_RECT==1) break;
			//printf("#no_rect=%d\n\n\n",no_rect);
			//すべて長方形
			if(no_rect==0) break;
		}
		//出力
		if(NO_RECT) printf("SUSPICIOUS1\n");
		else if(no_rect) printf("SUSPICIOUS2\n");
		else printf("SAFE1\n");
	}
	
	return 0;
}
//printf("#1");
//printf("M[%d].str=%c\nM[%d].high=%d\nM[%d].wide=%d\n",num,M[num].str,num,M[num].high,num,M[num].wide);
//printf("M[%d].start[0]=%d\nM[%d].start[1]=%d\n\n",num,M[num].start[0],num,M[num].start[1]);
//printf("M[%d].JUDGE=%d\n\n",num,M[num].JUDGE);
//printf("s1=%d s2=%d\n",s1,s2);
//printf("#no_rect=%d\n\n\n",no_rect);
//printf("#s1=%d\n#s2=%d\n",s1,s2);
/*
1
10 10
..........
.DDDDDD...
.DDDDCCC..
.DDDDCCC..
ADDDDCCC..
AAA..CCC..
AAABBBBC..
AAABBBB...
..BBBBB...
..........
*/
/*
1
10 10
..........
.DDDDCCC..
.DDDDCCC..
.DDDDCCC..
ADDDDCCC..
AAA..CCC..
AAABBBBC..
AAABBBB...
..BBBBB...
..........
*/


Compiler output:
a.cc: In function 'int main()':
a.cc:142:2: error: expected '}' at end of input
  142 | }
      |  ^
a.cc:13:1: note: to match this '{'
   13 | {
      | ^