牛客网多校赛第七场J--Sudoku Subrectangle
链接:https://www.nowcoder.com/acm/contest/145/J
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
Special Judge, 64bit IO Format: %lld
题目描述
You have a n * m grid of characters, where each character is an English letter (lowercase or uppercase, which means there are a total of 52 different possible letters).
A nonempty subrectangle of the grid is called sudoku-like if for any row or column in the subrectangle, all the cells in it have distinct characters.
How many sudoku-like subrectangles of the grid are there?
输入描述:
The first line of input contains two space-separated integers n, m (1 ≤ n, m ≤ 1000). The next n lines contain m characters each, denoting the characters of the grid. Each character is an English letter (which can be either uppercase or lowercase).
输出描述:
Output a single integer, the number of sudoku-like subrectangles.
示例1
输入
2 3
AaA
caa
输出
11
说明
For simplicity, denote the j-th character on the i-th row as (i, j). For sample 1, there are 11 sudoku-like subrectangles. Denote a subrectangle
by (x1, y1, x2, y2), where (x1, y1) and (x2, y2) are the upper-left and lower-right coordinates of the subrectangle. The sudoku-like subrectangles are (1, 1, 1, 1), (1, 2, 1, 2), (1, 3, 1, 3), (2, 1, 2, 1), (2, 2, 2, 2), (2, 3, 2, 3), (1, 1, 1, 2), (1, 2, 1, 3), (2, 1, 2, 2), (1, 1, 2, 1), (1, 3, 2, 3).
示例2
输入
4 5
abcde
fGhij
klmno
pqrst
输出
150
说明
For sample 2, the grid has 150 nonempty subrectangles, and all of them are sudoku-like.
数据量不是很大 可以枚举
但是纯暴力的枚举可能会T 因为是52*52*n*m
感觉还是挺考验思维的...反正我不是很会敲...看了题解觉得好巧妙
可以优化到52*n*m
首先预处理出每个位置距离上一个相同字母的距离 dp
然后枚举每一个点 每次往左走一格看看能多多少个长方形【与高度有关】,这个高度是不可能变大的
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#define inf 0x3f3f3f3f
using namespace std;
int n, m;
const int maxn = 1005;
char grid[maxn][maxn];
int pos[maxn], L[maxn][maxn], U[maxn][maxn], len[maxn];
//pos 上一次该字母出现的位子 LU分别表示距离相同字母最近的距离
int main()
{
while(scanf("%d%d", &n, &m) != EOF){
for(int i = 1; i <= n; i++){
scanf("%s", grid[i] + 1);
}
for(int i = 1; i <= n; i++){
memset(pos, 0, sizeof(pos));
for(int j = 1; j <= m; j++){
L[i][j] = min(L[i][j - 1] + 1, j - pos[grid[i][j]]);
pos[grid[i][j]] = j;
}
}
for(int j = 1; j <= m; j++){
memset(pos, 0, sizeof(pos));
for(int i = 1; i <= n; i++){
U[i][j] = min(U[i - 1][j] + 1, i - pos[grid[i][j]]);
pos[grid[i][j]] = i;
}
}
long long ans = 0;
for(int j = 1; j <= m; j++){
memset(len, 0, sizeof(len));
for(int i = 1; i <= n; i++){
for(int k = 0; k < L[i][j]; k++){
len[k] = min(len[k] + 1, U[i][j - k]);
if(k) len[k] = min(len[k], len[k - 1]);
ans += len[k];
}
for(int k = L[i][j]; k < 54; k++) len[k] = 0;
}
}
printf("%lld\n", ans);
}
return 0;
}
for(int j = 1; j <= m; j++){
memset(pos, 0, sizeof(pos));
for(int i = 1; i <= n; i++){
U[i][j] = min(U[i - 1][j] + 1, i - pos[grid[i][j]]);
pos[grid[i][j]] = i;
}
}
long long ans = 0;
for(int j = 1; j <= m; j++){
memset(len, 0, sizeof(len));//len表示当前列可以向上的长度
for(int i = 1; i <= n; i++){
for(int k = 0; k < L[i][j]; k++){
len[k] = min(len[k] + 1, U[i][j - k]);
if(k) len[k] = min(len[k], len[k - 1]);
ans += len[k];
}
for(int k = L[i][j]; k < 54; k++) len[k] = 0;
}
}
printf("%lld\n", ans);
}
return 0;
}
牛客网多校赛第七场J--Sudoku Subrectangle的更多相关文章
- 牛客网多校赛第七场--C Bit Compression【位运算】【暴力】
链接:https://www.nowcoder.com/acm/contest/145/C 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524 ...
- 牛客网多校赛第七场A--Minimum Cost Perfect Matching【位运算】【规律】
链接:https://www.nowcoder.com/acm/contest/145/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...
- 牛客网多校赛第9场 E-Music Game【概率期望】【逆元】
链接:https://www.nowcoder.com/acm/contest/147/E 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...
- 牛客网-湘潭大学校赛重现H题 (线段树 染色问题)
链接:https://www.nowcoder.com/acm/contest/105/H来源:牛客网 n个桶按顺序排列,我们用1~n给桶标号.有两种操作: 1 l r c 区间[l,r]中的每个桶中 ...
- 牛客网多校赛第九场A-circulant matrix【数论】
链接:https://www.nowcoder.com/acm/contest/147/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...
- 牛客网多校训练第四场C sequence
(牛客场场有笛卡尔树,场场都不会用笛卡尔树...自闭,补题心得) 题目链接:https://ac.nowcoder.com/acm/contest/884/C 题意:给出两个序列a,b,求max{mi ...
- 牛客网多校训练第三场 C - Shuffle Cards(Splay / rope)
链接: https://www.nowcoder.com/acm/contest/141/C 题意: 给出一个n个元素的序列(1,2,...,n)和m个操作(1≤n,m≤1e5),每个操作给出两个数p ...
- 牛客网多校训练第三场 A - PACM Team(01背包变形 + 记录方案)
链接: https://www.nowcoder.com/acm/contest/141/A 题意: 有n(1≤n≤36)个物品,每个物品有四种代价pi,ai,ci,mi,价值为gi(0≤pi,ai, ...
- 牛客网多校训练第八场A All one Matrix
题目链接:https://ac.nowcoder.com/acm/contest/888/A 题意:求出有多少个不被包含的全1子矩阵 解题思路:首先对列做处理,维护每个位置向上1的个数,然后我们从最后 ...
随机推荐
- MongoDB 常用shell命令汇总
//指定用户名和密码连接到指定的MongoDB数据库 mongo 192.168.1.200:27017/admin -u user -p password use youDbName 1.Mongo ...
- 转载:30多条mysql数据库优化方法,千万级数据库记录查询轻松解决
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- erlang的小知识,未分类。
erlang:module_loaded(module):检测模块是否已加载:
- Unity对象查找
1. GameObject.Find 全局摄像机 全局画布 全局灯光 无法查找隐藏对象 ,效率低下,要用完全的路径来提升查找效率 2. transform.Find UI中全部使用此方法 可以查找 ...
- yield的作用
执行程序遇到yield关键字会交出执行权,跳出协程方法,继续执行协程方法以外的其他代码逻辑,在约定的时间后,重新回到yield关键字处,继续执行yield语句后面的代码内容, yield return ...
- python常用内置模块,执行系统命令的模块
Subprocess模块 python3.5将使用Subprocess模块跟操作系统进行交互,比如系统命令,他将替换 os.system os.spawn* subprocess.run()方法封装的 ...
- /etc/hostname
我们可以使用 hostname 命令来修改主机名,但只是临时生效,如果想永久生效可以编辑 /etc/hostname 文件,注意不是每个 Linux 发行版都有该文件 root@Ubuntu_Lee: ...
- 运行 3ds Max 时出现的性能问题
运行 3ds Max 时性能减慢或迟缓通常是由于视频配置冲突或内存分配问题引起的.关于性能问题的一大难点在于缩小范围确定问题原因.以下是一些限制 3ds Max 操作的常见情形,以及纠正这 ...
- mybatis 循环遍历
/****Service/ public ServiceMessage<MemberFreedomRepModel> getMFListByPay(Long memberId,Long f ...
- 说说GPIO.H(NUC131)
/**************************************************************************//** * @file GPIO.h * @ve ...