趴在床上写的。
提交两次AC。
预处理一下输入,就变成了hduoj_1505。
代码如下。
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
char map[1001][1001];
int _map[1001][1001];
int l[1001], r[1001];
int max;
int n, m;
char o[][4] = { { 'w','y','z','a' },{ 'w','x','z','b' },{ 'x','y','z','c' } };
void solve(char c)
{
int index = c - 'a';
int i, j, k;
memset(_map, 0, sizeof(_map));
for (i = 1; i <= n; i++)
{
for (j = 1; j <= m; j++)
{
for (k = 0; k <= 3; k++)
{
if (map[i][j] == o[index][k])
{
_map[i][j] = 1;
break;
}
}
}
}
// 下面的和 hduoj 1505 1506 类似了
// 累加
for (i = 2; i <= n; i++)
{
for (j = 1; j <= m; j++)
{
if (_map[i][j])
_map[i][j] = _map[i - 1][j] + 1;
}
}
for (i = 1; i <= n; i++)
{
for (j = 1; j <= m; j++)
l[j] = r[j] = j;
for (j = 2; j <= m; j++)
{
while (l[j] > 1 && _map[i][j] <= _map[i][l[j] - 1])
l[j] = l[l[j] - 1];
}
for (j = m - 1; j >= 1; j--)
{
while (r[j] < m && _map[i][j] <= _map[i][r[j] + 1])
r[j] = r[r[j] + 1];
}
for (j = 1; j <= m; j++)
max = max > (_map[i][j] * (r[j] - l[j] + 1)) ? max : (_map[i][j] * (r[j] - l[j] + 1));
}
}
int main()
{
int i, j;
while (EOF != scanf("%d %d", &n, &m))
{
getchar();
for (i = 1; i <= n; i++)
{
for (j = 1; j <= m; j++)
scanf("%c", &map[i][j]);
getchar();
}
max = -1;
solve('a');
solve('b');
solve('c');
printf("%d\n", max);
}
return 0;
}
AC后很开心。但是看了一下时间是 873ms/1000ms ,顺便看了一下本题的rank,发现自己不知道靠后到哪里去了。
因此还是要加油!
晚安!