题目大意:给定一个 N*M 的矩阵,定义一个矩形区域为一个“国旗”,满足:矩形区域可以按行划分成三个高度相同的部分,其中每一个部分中的颜色完全相同,第一部分的颜色与第二部分颜色不同,第二部分的颜色和第三部分的颜色不同。求给定的矩阵中有多少个不同的国旗,位置不同即为不同。

题解:

首先定义一个数组 d[][],其中 d[i][j] 表示以第 i 行,第 j 列的元素为顶端,在满足下面颜色和当前位置颜色相同的前提下,能够向下延伸的最长距离。

这道题是一个计数问题,现在定义计数的方式为:计数以每个点为顶点的国旗数量,显然可以保证不重不漏。

对于每个点,d[][] 数组即为第一部分的高度,如果该点可以做成一个国旗,那么要求第二部分的颜色不同于该部分,且第二部分的 d[][] 要和第一部分相等,第三部分同理。

在考虑如何计数宽度大于 1 的部分:对于同一行,维护一个变量 K,遍历每一列,若后一列和前一列相同,则 K++,否则,K=1;若当前列不能组成国旗,则 K=0 即可。

代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=1010;
typedef long long LL; int n,m,d[maxn][maxn];LL ans;
char s[maxn][maxn]; int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%s",s[i]+1); for(int i=n;i>=1;i--)
for(int j=1;j<=m;j++){
if(s[i][j]==s[i+1][j])d[i][j]=d[i+1][j]+1;
else d[i][j]=1;
}
for(int i=1;i<=n;i++){
for(int j=1,k=0;j<=m;j++){
int h=d[i][j];
if(i+3*h-1<=n&&d[i+h][j]==h&&d[i+2*h][j]>=h&&s[i][j]!=s[i+h][j]&&s[i+h][j]!=s[i+2*h][j]){
if(k&&s[i][j]==s[i][j-1]&&d[i][j-1]==h&&s[i+h][j]==s[i+h][j-1]&&d[i+h][j-1]==h&&s[i+2*h][j]==s[i+2*h][j-1]&&d[i+2*h][j-1]>=h)
++k;
else
k=1;
}
else k=0;
ans+=k;
}
}
printf("%lld\n",ans); return 0;
}

【CF1181C】Flag的更多相关文章

  1. 【转载】flag标志什么?哦,它标志代码馊了

    几乎每次在代码中发现flag变量,我总是能嗅到一股馊味.不管你闻没闻到,反正我闻到了. 在代码中,flag通常作为标志变量的名字.但问题在于,不是所有的问题或代码都需要使用这种标志变量,更不是使用标志 ...

  2. 八大排序算法~冒泡排序【加变量flag的作用】

    八大算法~冒泡排序[加变量flag的作用] 1,冒泡排序思想:从第一个数开始找,要把大数"排除在外"~为大数找后座.(从小到大排序哈) 外层循环~需要放后的大数个数: 内循环~从第 ...

  3. 【原】AFNetworking源码阅读(六)

    [原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...

  4. 【原】SDWebImage源码阅读(二)

    [原]SDWebImage源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 解决上一篇遗留的坑 上一篇中对sd_setImageWithURL函数简单分析了一下,还 ...

  5. 【原】SDWebImage源码阅读(一)

    [原]SDWebImage源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 一直没有系统地读过整套源码,就感觉像一直看零碎的知识点,没有系统读过一本专业经典书 ...

  6. Java基础知识【上】(转载)

    http://blog.csdn.net/silentbalanceyh/article/details/4608272 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...

  7. 【HDU2896】病毒侵袭 AC自动机

    [HDU2896]病毒侵袭 Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋--我们能在有生之年看到500年 ...

  8. 【译文】 GC 安全点 和安全区域

    原文链接 : here 根引用  Root references  一个实例死了,意味着它变得无用.只用程序员知道一个实例是否已经无用.为了让程序知道一个实例是否已经无用,我们可以使用编译器分析,引用 ...

  9. 首师大附中互测题:50229234海岛帝国:独立之战【C002】

    [C002]50229234海岛帝国:独立之战[难度C]———————————————————————————————————————————————————————————————————————— ...

随机推荐

  1. python高级 之(三) --- 高阶函数

    高阶函数 map函数 简介 """ map(func,*iterables) 参数:一个是函数.一个是序列 作用:将序列中的元素依此作用于函数,将函数运行结果返回 存放于 ...

  2. webhooks动态更新配置

    config server 项目中加入 monitor依赖 <dependency> <groupId>org.springframework.cloud</groupI ...

  3. 【DSP开发】【Linux开发】Linux下PCI设备驱动程序开发

    PCI是一种广泛采用的总线标准,它提供了许多优于其它总线标准(如EISA)的新特性,目前已经成为计算机系统中应用最为广泛,并且最为通用的总线标准.Linux的内核能较好地支持PCI总线,本文以Inte ...

  4. C语言之联合体

    联合union是一个能在同一个存储空间存储不同类型数据的类型 联合体所占的内存长度等于其最长成员的长度,也有叫做共用体 联合体虽然可以有多个成员,但同一时间只能存放其中一种 对于联合体来讲最基本的原则 ...

  5. NumPy进阶

    数组算术 任何两个等尺寸数组之间的算术操作都应用了逐元素操作的方式. arr1 = np.array([[1,2,3],[4,5,6]]) arr2 = np.array([[4,2,1],[7,2, ...

  6. 设计模式:备忘录模式(Memento)

    个人比较喜欢玩单机游戏,什么仙剑.古剑.鬼泣.使命召唤.三国无双等等一系列的游戏我都玩过(现在期待凡人修仙传),对于这些游戏除了剧情好.场面大.爽快之外,还可以随时存档,等到下次想玩了又可以从刚开始的 ...

  7. 列出bug的几种状态

    1.New:(新的) 当某个“bug”被发现的时候(第一次),测试人员需要与项目负责人沟通以确认发现的的确是一个bug,如果被确认是一个bug,就将其记录下来,并将bug的状态设为New. 2.Ass ...

  8. 手写一个python迭代器

    分析 我们都知道一个可迭代对象可以通过iter()可以返回一个迭代器. 如果想要一个对象称为可迭代对象,即可以使用for,那么必须实现__iter __()方法. 在一个类的实例对象想要变成迭代器,就 ...

  9. 基于Hadoop伪分布式集群搭建Spark

    一.前置安装 1)JDK 2)Hadoop伪分布式集群 二.Scala安装 1)解压Scala安装包 2)环境变量 SCALA_HOME = C:\ProgramData\scala-2.10.6 P ...

  10. 前端 使用localStorage 和 Cookie相结合的方式跨页面传递参数

    A页面 html代码: 姓名:<input type="text" id="name1"> 年龄:<input type="text ...