国庆六日游——第三天第一题

别问我为什么不讲第二天

正题:

给定一个长度为2N的字符串S,S表示为2N个格子的染色情况。Si = B 时表示第i个格子为黑色,否则若Si = W表示第i个格子为白色。

你需要进行恰好n次操作,使得所有格子的颜色都变为白色。第i次操作时,你可以选择两个未在之前操作中选择过的格子li,ri (li < ri), 并翻转所有下标在[li, ri]中的格子的颜色。所有操作结束后,每个格子应恰好被选择一次。

请求出合法操作序列的方案数对109 + 7取模的结果。

我们认为两个操作序列不同,当且仅当存在某个正整数i ∈ [1, n] 使得两个操作序列对应的li或ri不同。

本题有多组数据。

输入的第一行包含一个正整数 T,表示数据组数。
接下来2T行,第 (2i−1)行和第2i行表示第 i 组数据。其中,第(2i−1)行包含一个正整数,表示这组数据中的 n,第2i行包含一个仅由 B 和 W 构成的长度为 2n 的字符串S,含义如题面所示。

输出 T 行,其中第 i 行包含一个整数,表示第 i 组数据的答案。

保证1 <= T <= 10, 1 <= n <= 105

时间限制:1000ms,空间限制:128MB

样例:
2
2
BWWB
4
BWBBWWWB

输出:
4
288

题面有点丑,先看着qwq

思路

看到这道题,你的第一反应是什么?
爆搜
一个序列,每个数有两种状态,每次可以翻转一段区间内的状态,我们要把所有数转化成同一个状态

显然这题应该和奇偶性有关。

为了方便,后面用“0” 表示 “W”, “1” 表示 “B”

我们的目标状态是一个全0的序列,也就是说,原来是“1”的位置需要被覆盖奇数次,反之需要偶数次。

接下来思考这个条件应该如何运用

先想一想搜索的时候,你会怎么搜?

当然是从左往右从右往左我也拦不住你,按照同一个方向搜(不然怎么递归)

我们思考的时候,也同样可以这样假设:在考虑第i个数的时候, [1 , i)内的数已经全部确定,不需要再考虑。

在这道题里,“确定”可以理解为

  • 被占用(不可以再次被选中)
  • 如果局面存在解,那么操作完毕后,该位置一定合法(无后效性)
  • 确定是左端点或右端点

其中第三条是我们的分析重点

首先,看到左端点和右端点,你能想到什么题目?

莫队括号匹配

显然,当我们确定下来每个端点是左端点还是右端点时,总情况数是容易计算的。

那么怎么确定端点呢?
这里就要用到刚才的奇偶判断了。

首先,第i个位置被[1, i)为起点的区间覆盖次数,等于[1, i) 中左端点数量减去右端点数量
类似植物大战僵尸
设[1, i) 有a个左端点,b个右端点
显然a - b ≡ a + b = i - 1 (mod 2)
有问题请举手
假设 i 除以 2 余 r
那么如果s[i] = r,则i是左端点
否则是左端点
画一画就知道了

我们可以从左往右扫描,过程中记录剩余的左括号数量,遇到右括号更新答案和括号数量

需要注意的是,s[0] 不可以是右端点,s[2n - 1]不可以是左端点!(显然)
因此需要加一个小小的特判优化

上代码:

#include<cstdio>
using namespace std;
const int mod = 1000000007;
const int man = 200010;
struct Int {int v;Int(int x) {v = x;}Int operator *= (int x) {v = 1LL * v * x % mod; return *this;}
}; //为了计算方便;
signed main() {//freopen("reversal.in", "r", stdin);//freopen("reversal.out", "w", stdout); 不解释int t; scanf("%d", &t);char s[man]; int n;while(t--) {scanf("%d", &n); scanf("%s", s + 1);if(s[1] == 'W' || s[n << 1] == 'W') {printf("0\n"); continue;} //特判bool now = false; Int ans = 1; int left = 1; //左括号数量for(int i = 2; i < n << 1; ++i) {if(now ^= (s[i] == s[i - 1])) {ans *= left--; //判断s[i]的偶性} else left++;} if(left - 1) {printf("0\n"); continue;} else {while(n) {ans *= n--;} printf("%d\n", ans.v);}}
}

国庆六日游——第三天第一题相关推荐

  1. 国庆六日游——第一天第一题

    国庆六日游--第一天第一题 普及组请出门右转 萌新出门左转 正题: 一场天灾过后,B市的所有主干道路都被切断了. 灾后重建的一项重要任务是恢复通信.B市共有n个关键的据点,而我们现在有一条关键的消息, ...

  2. 爱奇艺2018秋季校招测试工程师(第一场、第二场、第三场)编程题汇总 - 题解

    做了下爱奇艺2018测试工程师的编程题,教开发工程师还是偏简单,特意写了个编程题合集. 题目链接: 爱奇艺2018秋季校招测试工程师(第一场): 爱奇艺2018秋季校招测试工程师(第二场): 爱奇艺2 ...

  3. 华为7.31笔试(第一题AC、第二题AC、第三题超纲)

    第一题 题目:小明是个强迫症卖家,有10000台设备,卖的均价要求最接近D元,输出卖出的台数N,总售价M 输入 0<D<10,精确到小数点后12位   :   输出 M N 思路: 均价与 ...

  4. 100个人回答五道试题,有81人答对第一题,91人答对第二题,85人答对第三题,79人答对

    题目: 100个人回答五道试题,有81人答对第一题,91人答对第二题,85人答对第三题,79人答对第四题,74人答对第五题,答对三道题或三道题以上的人算及格, 那么,在这100人中,至少有( )人及格 ...

  5. 2021年春季学期-信号与系统-第一次作业参考答案-第一题

      本文是: 2021年春季学期-信号与系统-第一次作业参考答案 的参考答案. ▌第一题 1.绘出下列各信号的波形: 注:u(t),u[n]u\left( t \right),\,\,u\left[ ...

  6. poj1182 and 携程预赛2第一题 带权并查集

    题意:       动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A.  现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底 ...

  7. 简单易懂的 pwnable.kr 第一题[fd]Writeupt

    简单易懂的 pwnable.kr 第一题[fd]Writeupt 题目地址http://pwnable.kr/play.php 题目 题目中给出了ssh远程登录的地址以及登录密码我们先连接,输入密码: ...

  8. 图论测试题(一)第一题:longest

    第一题:longest 乌托邦有n个城市,某些城市之间有公路连接.任意两个城市都可以通过公路直接或者间接到达,并且任意两个城市之间有且仅有一条路径(What does this imply? A tr ...

  9. Megcup 2017 决赛第一题 规则

    2017Megcup 2017Megcup决赛第三题题解 赛题评论 只做出了一道题,虽然慢慢地退出了前128名,但还是要记录一下. 10点钟开始,一看第一题很熟悉,因为研究过格点图中电流问题,其实就是 ...

最新文章

  1. linux虚拟网卡名不是eth0,linux不能启动虚拟网卡eth0
  2. 在layui中使用ajax传值给后台,浅谈layui 数据表格前后台传值的问题
  3. Django - 模板相关
  4. Java创建对象详解
  5. 零基础编程入门基础语句!小白必点,大牛绕道!
  6. 无盘服务器 cpu占用,顺网科技网维大师程序占CPU资源多的解决过程
  7. 满满的干货!mysql技术介绍
  8. 咏南WEB APP开发框架
  9. 为自己编写的windows应用程序制作安装包
  10. [NLP]OpenNLP词形还原器(Lemmatizer)的使用
  11. UPC 条形码的介绍及计算校验码
  12. Egg.js框架的简单使用
  13. 2012年1月份第3周51Aspx源码发布详情
  14. vue点击图片放大功能
  15. 使用python进行序列的GC含量的统计
  16. golang sync/atomic
  17. OpenJudge_P7833 幂的末尾
  18. 街头立体画的创作过程
  19. R语言学习丨散点图怎么画?绘图基本知识与常用函数
  20. MMsegmentation教程1:学习配置文件

热门文章

  1. python字符编码使用ascii编码储存_python与字符编码问题
  2. 最新中国贫富标准线 你属哪个层次?
  3. Revit开发柱附着和分离
  4. Unity模型导入相关知识
  5. 使用three.js导入OBJ模型,变更、修改成其他OBJ模型和模型不可见原因说明
  6. layui文件上传回调前对文件类型及大小判断
  7. (只需两步)让ChatGPT免费帮你制作出漂亮的PPT
  8. C++ 函数重载(第三章)
  9. python from import找不到库_如何查找python代码中所有未使用到的from与import的类库...
  10. 一个岔路口分别通向诚实国和说谎国