Educational Codeforces Round 59 (Rated for Div. 2) D. Compression

题目链接   http://codeforces.com/contest/1107/problem/D

 

1、首先要把十六进制转化为2进制吧,这里用到了位运算,取出他的每一位和1按位与就可以求出二进制,注意这里需要倒着储存

2、判断是否能压缩能x时,是通过x*x的矩阵中是不是全是1或0,所以就先求和判断,这里是先把和全部算出来,储存在一个数组里,然后判断。

看了题解和其他的代码然后才写出来的

#include
using namespace std;
string str;
int matrix[5205][5205], sum[5205][5205];

int to_int(char q)
{
	return isdigit(q) ? q-'0' : q-'A'+10;
}

int main()
{
	std::ios::sync_with_stdio(false);
	int n, flag, flag1, i,j,x;
	while(cin >> n)
	{
		memset(matrix, 0, sizeof(matrix));
		memset(sum, 0, sizeof(sum));
		//十六进制转二进制 
		for(i = 0; i < n; i++)
		{
			cin >> str;
			for(j = 0; j < n/4; j++)
			{
				matrix[i][j*4+3] = (to_int(str[j]) >> 0) & 1;//注意要倒着储存,先是j*4+3 然后是j*4+2 
				matrix[i][j*4+2] = (to_int(str[j]) >> 1) & 1;
				matrix[i][j*4+1] = (to_int(str[j]) >> 2) & 1;
				matrix[i][j*4+0] = (to_int(str[j]) >> 3) & 1;
			}
		}
		//先储存和,sum[i+1][j+1]储存着sum[0][0]- sum[i][j]这(i+1)*(j+1)大小矩阵的和 
		for(i = 0; i < n; i++)
		{
			for(j = 0; j < n; j++)
			{
				sum[i+1][j+1] = sum[i][j+1] + sum[i+1][j] - sum[i][j] +matrix[i][j];
			}
		} 
		
		flag1 = 1;
		for(x = n; x>=1 && flag1; x--)
		{
			if(n%x==0)
			{
				flag = 1;
				for(i = 0; i < n && flag; i+=x)
				{
					for(j = 0; j < n && flag; j+=x)
					{
						int temp = sum[i+x][j+x] - sum[i][j+x]+sum[i][j] - sum[i+x][j];
						if(temp != x*x && temp != 0)
						{
							flag =  0;
						}
					}
				}
				if(flag)
				{
					cout << x << endl;
					flag1 = 0;
				}
			}
			
		}
	}

	return 0;
} 

 

你可能感兴趣的:(思维)