CF-1202C-You Are Given a WASD-string...

  • 题目描述
  • (题解)思路
  • 代码

题目链接: codeforces-1202C.

题目描述

          \;\;\;\;\; 在一个二维的格点图中,给出一个字符串 sss 包含四种字符 ‘W’‘S’‘A’‘D’‘W’‘S’‘A’‘D’‘W’‘S’‘A’‘D’,一个字符为一个命令,分别表示向上、下、左、右四个方向走一格。这样,从一个格子出发,按照字符串顺序,走过一条轨迹,如题目中图片所示。可以用一个最小的矩形包含这条轨迹。

          \;\;\;\;\; 问:在字符串中至多加入一个命令,使这个矩形的面积最小。输出面积的最小值。

          \;\;\;\;\; 1≤∣s∣≤2⋅1051\leq |s| \leq 2 \cdot 10^{5}1≤∣s∣≤2⋅105.

(题解)思路

      \;\;\; 对于最初的轨迹而言,矩形的宽度取决于字符串中的 ′A′  ′D′'A' \; 'D'′A′′D′ 字符, 与其它字符无关。所以在只考虑宽度的情况下,可以转化为一维问题,这时只看字符串中的 ′A′  ′D′'A' \; 'D'′A′′D′ 两种字符。假设最初位于点 0 ,每遇到一个命令 ‘A’‘A’‘A’ ,坐标 −1-1−1,每遇到一个命令 ‘D’‘D’‘D’ ,坐标 +1+1+1.
      \;\;\; 依次扫描字符串时,记录遇到命令 ′A′  ′D′'A' \; 'D'′A′′D′ 时的前缀和 sumsumsum,矩形的左边界为 l=min{sum}l=min\left \{ sum \right \}l=min{sum},右边界 r=max{sum}r = max \left \{ sum \right \}r=max{sum},矩形的宽度 W=r−l+1W = r - l + 1W=r−l+1.
      \;\;\; 现在考虑插入一个 ′D′'D'′D′,即 +1+1+1,要使矩形的宽度变小,就要在插入 +1+1+1 后使最小值变大,即将左边界 lll 右移,还要保证右边界不会右移。思考插入至何处可以满足这个条件。

s1 A A A A D D D
下标 0 1 2 3 4 5 6
sum = 0 -1 -2 -3 -4 -3 -2 -1
s2 D D D A A D A
下标 0 1 2 3 4 5 6
sum = 0 1 2 3 2 1 2 1

      \;\;\; 对于序列 s1s1s1, 将 +1+1+1 插入 ′A′'A'′A′ 中间,最小值可变大,但最大值也会变大,插入 ′D′'D'′D′ 中间,只会将最大值变大,均无用。
      \;\;\; 对于序列 s2s2s2, 将 +1+1+1 插入下标 333 之前,会使最大值变大;其中有两个位置 4,64,64,6 均为最小值,若插入 4−64-64−6 之间,只能使位置 666 处的值变大,而序列的最小值不变。所以应将 +1+1+1 插入位置 444 之前。
&ThickSpace;&ThickSpace;&ThickSpace;\;\;\; 综上所述,应将 +1+1+1 插入最后一个最大值之后,第一个最小值之前。如果 Max′s&ThickSpace;lastplace&lt;Min′s&ThickSpace;firstplaceMax's\;lastplace &lt; Min's\;firstplaceMax′slastplace<Min′sfirstplace, 可插入 +1+1+1 使最小值变大。矩形宽度 −1-1−1.
&ThickSpace;&ThickSpace;&ThickSpace;\;\;\; 插入其他字符原理相同。

&ThickSpace;&ThickSpace;&ThickSpace;\;\;\;注意点:
&ThickSpace;&ThickSpace;&ThickSpace;&ThickSpace;&ThickSpace;\;\;\;\;\; 当某宽度或长度方向的序列长度 < 2时,该方向无法再缩小。
&ThickSpace;&ThickSpace;&ThickSpace;&ThickSpace;&ThickSpace;\;\;\;\;\; 当宽度和长度均可缩小时,应判断缩小哪个使面积最小。
&ThickSpace;&ThickSpace;&ThickSpace;\;\;\;时间复杂度:O(∣S∣)O(|S|)O(∣S∣)

代码

/*
nero
2019-8-22 00:52:50
long long 写的 %d WA1
*/#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <bits/stdc++.h>using namespace std;#define lson(u) (u<<1)
#define rson(u) (u<<1|1)
#define Pi acos(-1)
#define iINF 0x3f3f3f3f
#define lINF 0x3f3f3f3f3f3f3f
#define EPS 0.000000001
#define pii pair<int,int>
typedef long long ll;
typedef unsigned long long ull;const int MAXN = 200005;
int len, flag = 0;
char s[MAXN];
ll solve(char c1, char c2) {int Min = 0, Max = 0, sum = 0;int p_lastMax = -1, p_firstMax = -1, p_lastMin = -1, p_firstMin = -1;int c = 0;for(int i = 0; i < len; i++) {bool ys = 0;if(s[i] == c1) sum--, ys = 1;if(s[i] == c2) sum++, ys = 1;if(ys) {c++;if(sum == Max) {p_lastMax = i; }if(sum > Max) {p_firstMax = p_lastMax = i;Max = sum;}if(sum == Min) {p_lastMin = i; }if(sum < Min) {p_firstMin = p_lastMin = i;Min = sum;}          }}ll tmp = Max - Min + 1;if((c > 1) && (p_lastMax < p_firstMin || p_firstMax > p_lastMin)) {tmp--;flag++;}     return tmp;
}
int main()
{int T;scanf("%d", &T);while(T--) {flag = 0;scanf("%s", s);len = strlen(s);ll W = solve('W', 'S');ll H = solve('A', 'D');ll ans;if(flag == 2) ans = min(W * (H+1), (W+1) * H);else ans = W * H; printf("%lld\n", ans);  }   return 0;
}

codeforces-1202C-WASD-string相关推荐

  1. CodeForces - 1535C Unstable String(思维)

    题目链接:点击查看 题目大意:规定一个字符串将问号都替换成 000 或 111 后满足 010101 交替的话,该字符串是合法的,现在给出一个长度为 nnn 的字符串,求合法子串的个数 题目分析:两种 ...

  2. CodeForces 797C Minimal string

    栈. 先处理一下后缀最小值. 对于每一个字符,如果不是后缀最小值,将栈顶小于当前后缀最小值的都弹出,然后压入当前字符. 如果是后缀最小值,将栈顶小于当前后缀最小值的都弹出,再输出该字符. #inclu ...

  3. Codeforces 797C Minimal string【贪心】

    题意: 给出了字符串s的内容,字符串t,u初始默认为空,允许做两种操作: 1.把s字符串第一个字符转移到t字符串最后. 2.把t字符串最后一个字符转移到u字符串最后. 最后要求s.t字符串都为空,问u ...

  4. CodeForces - 1252D Find String in a Grid(AC自动机)

    题目链接:点击查看 题目大意:给出一个 n * m 的字符矩阵,再给出 q 次询问,每次询问需要回答给出字符串在字符矩阵中出现了多少次,规定在字符矩阵中查找某个字符串,只能先向右 a 个单位,再向下 ...

  5. 【CodeForces - 827A】String Reconstruction(并查集合并区间,思维)

    题干: Ivan had string s consisting of small English letters. However, his friend Julia decided to make ...

  6. codeforces 708B-Recover the String

    题目链接:http://codeforces.com/problemset/problem/708/B 题意:给出四个数分别代表字符串中子序列00,01,10,11的数量,求一个满足该条件的字符串. ...

  7. codeforces F.Fibonacci String Subsequences

    题意 定义F(x)为F(x-1)与F(x-2)的连接(其中F(0) = '0',F(1) = '1'). 给出一个长度不超过100的字符串s,询问s在F(x)的所有子序列中出现了多少次. 题解 数量很 ...

  8. ACM儿童节热身训练

    今天下午有一个儿童节热身的训练比赛,我跟一个同学两个人组队尝试做了一下,我们真的好菜,就A了三个题,看其他同学组的队都做了五六个(当然学长们组的队做了十个...)(记得我们提交完第二个题目之前学长们已 ...

  9. Java知识——精华总结

    Java知识--精华总结 一.java概述与基础知识 1.何为编程? 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程. 为了使计算机能够理解人的意图,人类就必须 ...

  10. 【Codeforces】1015B Obtaining the String(字符串 交换)

    http://codeforces.com/contest/1015/problem/B n 表示 字符串的长度 然后是两个字符串,每一次只能交换相邻的两个,如果选择第i个字符的话,只能交换第i个和第 ...

最新文章

  1. CSP 202006-2 稀疏向量 python实现(非满分)(待更新)
  2. 有没有办法折叠Eclipse中的所有代码块?
  3. poj 1190 生日蛋糕 难|供自己瞻仰
  4. Markdown基本语法【转】
  5. OpenCV加载Caffe框架模型
  6. 移动pc常用Meta标签
  7. 无线 在linux叫什么地方,请问有知道atheros无线网卡Linux驱动官方下载地址是什么吗?...
  8. 如何修改GitHub项目显示语言问题
  9. android版 eclipse
  10. 解决Error: Protected multilib versions:
  11. 用Python快速实现YOLO目标检测
  12. #Deep Learning回顾#之LeNet、AlexNet、GoogLeNet、VGG、ResNet
  13. day04-selenium滚动和常见反爬
  14. 小米笔记本解决风扇异响
  15. Python 矩形法求1/x的定积分(完美实现)
  16. ACM教程 - (数论)正整数分解使得乘积最大问题
  17. golang socket 例
  18. 一眼看清高科技,深度解析人工智能技术脉络
  19. 更改MAMP的mysql密码
  20. 独热编码 (One-Hot Encoding) 介绍及MATLAB命令

热门文章

  1. 无线ap安全dhcp服务器,AC+AP时代——办公区内满足安全性又够人性化的WiFi漫游设置攻略...
  2. MySQL数据库的基本管理操作
  3. java语言中如何表示素数,使用Java语言求素数的几个方法
  4. 分布式系统技术难题--异地多活
  5. 标注、注记、图形文本
  6. idea如何做到多模块开发项目
  7. 保险丝的常用规格型号及主要参数说明
  8. easyUI datebox 日期只显示年月及年月日切换的实现 js样式重新渲染加载
  9. 【转】MUD教程--巫师入门教程4
  10. 数值分析正割法python3实现并绘图