记录编号 452650 评测结果 AAAAAAA
题目名称 [USACO]家的范围 最终得分 100
用户昵称 GravatarKingSann 是否通过 通过
代码语言 C++ 运行时间 0.036 s
提交时间 2017-09-19 22:55:13 内存使用 1.09 MiB
显示代码纯文本
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>

using namespace std;

#define FN "range"

const int N = 300;

int n, ans[N], pre[N][N], sub[N][N];

char mp[N][N];

int main() {
    freopen(FN ".in", "r", stdin);
    freopen(FN ".out", "w", stdout);
    scanf("%d", &n);
    for(int i = 1 ; i <= n ; i ++) {
        scanf("%s", mp[i] + 1);
    }

    for(int i = 1 ; i <= n ; i ++) {
        for(int j = 1 ; j <= n ; j ++) {
            pre[i][j] += pre[i][j - 1] + (mp[i][j] == '1');
            sub[i][j] += sub[i - 1][j] + (mp[i][j] == '1');
        }
    }

    for(int i = 1 ; i <= n ; i ++) {
        for(int j = 1 ; j <= n ; j ++) {
            for(int k = 2 ; k <= n ; k ++) {
                int x = i + k - 1, y = j + k - 1;
                if(!(1 <= x && x <= n && 1 <= y && y <= n) || mp[i][j] != '1') {
                    break;
                }
                if((pre[x][y] - pre[x][j - 1] == (y - j + 1)) && (sub[x][y] - sub[i - 1][y] == (x - i + 1))) {
                    ans[k] ++;
                } else {
                    break;
                }
            }
        }
    }
    for(int i = 2 ; i <= n ; i ++) {
        if(ans[i]) {
            printf("%d %d\n", i, ans[i]);
        }
    }
}