题意

给你一个偶数长度的字符串,你想要给每一个字符标记成蓝色或者红色,使得红色的字符序列等于蓝色的字符序列,一共有多少种方法可以做这件事

输入格式

输入一行包含一个字符串\(S, (2≤|S|≤40)\)
字符串的每个字符为'o'或者'x'

输出格式

输出一个整数

样例输入&输出

样例1

oxox2

样例2

oooxxx0

样例3

xoxxox4

样例4

xo0

样例5

ooooxoox8

样例6

ooxxoxox8

样例7

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx137846528820

分析

本题就是要寻找长度为 \(\frac{|S|}{2}\) 的 \(S\) 的子序列 \(S_1\) 的个数,使 \(S\) 的另一个子序列 \(S_2\) 与 \(S_1\) 相等,且 \(S_2\) 与 \(S_1\) 互斥,即对于任意\(S_1[i],S_2[j],i≠j\)。

我们能确定 \(S_1\) 的长度(即\(\frac{|S|}{2}\)),以及 \(S_1\) 中'o'和'x'的个数,于是想到爆搜穷举每一个可能的 \(S_1\) ,最多搜\(C^{20}_{10}=184756\)次。对于每一个可能的 \(S_1\) ,我们用\(O(n^2)\)的dp去检验它的方案数。设 \(dp[i][j]\) 表示枚举到第 \(i\) 位,其中有 \(j\) 位与 \(S_1\) 匹配的方案数,则

\[if(dp[i-1][j-1]存在且b[j]==a[i])dp[i][j]+=dp[i-1][j-1]\]

\[if(dp[i-1][j]存在且b[i-j]==a[i])dp[i][j]+=dp[i-1][j]\]

初始化\(dp[0][0]=1\)

最终答案为\(dp[n][n/2]\)

总时间复杂度为\(O(C^{n}_{n/2}* n^2)≈295609600\),卡卡常能过

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 45
using namespace std;
char s[maxn];
bool a[maxn],b[maxn];
int n,n1,n0;
long long ans,dp[maxn][maxn];
long long check(){for(int i=0;i<=n;i++){for(int j=0;j<=(n>>1);j++){dp[i][j]=0;}}dp[0][0]=1;for(int i=1;i<=n;i++){for(int j=0;j<=min(i,(n>>1));j++){if(j&&dp[i-1][j-1]&&b[j]==a[i])dp[i][j]+=dp[i-1][j-1];if(j<i&&dp[i-1][j]&&b[i-j]==a[i])dp[i][j]+=dp[i-1][j];}}return dp[n][n>>1];
}
void dfs(int step){if(step>(n>>1)){ans+=check();return;}if(n1){n1--;b[step]=1;dfs(step+1);n1++;}if(n0){n0--;b[step]=0;dfs(step+1);n0++;}
}
int main(){scanf("%s",s);n=strlen(s);for(int i=1;i<=n;i++){a[i]=(s[i-1]=='x');n1+=a[i],n0+=!a[i];}n1>>=1,n0>>=1;dfs(1);printf("%lld",ans);return 0;
}

转载于:https://www.cnblogs.com/BlogOfchc1234567890/p/9866599.html

XJOI 3877 红蓝字符串相关推荐

  1. 不能从远程创建com+对象_红蓝对抗攻防实战:寻找COM对象

    概述 渗透测试人员.红蓝对抗的蓝军(攻击方).恶意行动者经常会选择COM对象来实现横向移动.此前,一些安全研究人员陆续针对COM对象开展研究,包括Matt Nelson(enigma0x3)在2017 ...

  2. 红蓝对抗之Windows内网渗透

    无论是渗透测试,还是红蓝对抗,目的都是暴露风险,促进提升安全水平.企业往往在外网布置重兵把守,而内网防护相对来说千疮百孔,所以渗透高手往往通过攻击员工电脑.外网服务.职场WiFi等方式进入内网,然后发 ...

  3. 渗透测试-红/蓝队Hvv技术手册/面试

    红/蓝队Hvv技术手册/面试 介绍一下自己,喜欢研究的,实战过的项目,得过奖项的感悟. 经常关注的安全平台 基本功 网络协议(HTTP.TCP) 操作系统命令 底层编程开发(应用框架) 加密解密编码 ...

  4. p80 红蓝对抗-AWD 模式准备攻防监控批量

    数据来源 何为AWD AWD 常见比赛规则说明: Attack With Defence,简而言之就是你既是一个 hacker(黑客),又是一个 manager . 比赛形式:一般就是一个 ssh 对 ...

  5. 2019华为性格测试题_小红书达人力荐!华为 Mate20 Pro红蓝新色最懂女人心

    1月10日,华为在北京三里屯CHAO酒店举行了一场与众不同的发布会,这次发布会的主题是"红蓝知己",发布了华为Mate 20 Pro的两款新配色--馥蕾红.璨星蓝,而这两款新配色也 ...

  6. 红蓝对抗 linux内网渗透

    目录 一.前言 二.提权 2.1 利用内核漏洞进行提权 2.2 利用文件权限配置不当进行提权 2.3 利用SUID程序进行提权 三.隧道 3.1 SSH 3.2 nc/ncat 3.3 portmap ...

  7. 王者S19服务器维护时间表,王者荣耀s19buff刷新时间一览 红蓝BUFF刷新间隔是多久...

    王者荣耀S19赛季加大了打野位对战局的影响,因此熟悉红蓝BUFF的刷新时间非常重要,无论是反BUFF还是拿自家BUFF都应该清楚刷新时间点.今日光耀菌就为大家带来了红蓝BUFF的刷新时间表,快来了解一 ...

  8. 【网络安全】红蓝攻防:shellcode的分析

    前言 在做红蓝攻防时,常常要用到cs.msf等工具,使用工具生成shellcode或可执行程序,那么小小的shellcode为何能做这么多事情,拿到shellcode后又该怎么分析.希望这篇文章能给大 ...

  9. c++游戏代码坦克大作战_一红一蓝多种模式的双人小游戏:红蓝大作战

    作者有话说:上次推荐的森林冰火人很多小伙伴后台找我要链接,或者搜索不到:首先声明下森林冰火人.同桌大作战都不是辣椒人游戏工作室研发的,小编也是微信小游戏双人栏目下搜索到的,如果想要玩双人小游戏的可以打 ...

  10. java先抽到红球获胜,【图片】红蓝球概率问题,通过程序模拟抽取,计算结果已出,有兴趣来看【非现役文职吧】_百度贴吧...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我用的c语言,大一学的还没忘完....程序非常简单,就是生成随机数,然后根据随机数的结果进行计数就好了. 代码贴下面,有兴趣的可以看看. 懂行的请不要喷我 ...

最新文章

  1. WordPress漏洞扫描工具WPScan
  2. Jerry开发的SAP note工具
  3. L2-020. 功夫传人
  4. html网页设计要点,网站交互设计的8个要点
  5. 开发应用层的需要了解 framework层吗?---不需要!!!!
  6. mysql系统服务初始化_MySql服务初始化、安装、启动
  7. 目标检测之RRPN的学习笔记~
  8. 搭建ftp_Windows 10搭建FTP服务器!
  9. Python编程实践之Choose
  10. 【RSLogix5000】—(1.1)—厂房ControlLogix系统介绍(硬件介绍)——原理
  11. MySQL中幻读是如何解决的
  12. PG in not in系列方案比较
  13. 服务器主板支持什么cpu,怎么看主板支持什么CPU(主板和cpu兼容搭配知识)
  14. 元宵节没用智能名片在互联网发贺卡,那就OUT了
  15. TextView 悬挂缩进实现及解析
  16. 【洛谷】P4147 玉蟾宫 解题报告
  17. 帮你分清嵌入式与单片机
  18. 保险也能拼购?个人可以凑够人数组团购买医疗保险的4大风险
  19. 根本解决Python2中unicode编码问题
  20. 【程序源代码】一个安卓查询类app制作的​开源项目

热门文章

  1. 用c#写的smtp邮件发送类
  2. javascript中的forEach
  3. sourcetree使用说明
  4. 详解Linux防火墙iptables禁IP与解封IP常用命令
  5. android4.0 底部菜单,Android自定义控件系列(四)—底部菜单(下)
  6. c语言随机生成算式的对错判断,蔡奇宏软件工程第二次作业--四则运算
  7. velocity 获取list对象_Redis专题2:认识list、Zset与BitMaps
  8. 【渝粤教育】国家开放大学2018年秋季 0692-21T化工设备机械基础 参考试题
  9. 数据挖掘:概念与技术 笔记
  10. 为什么我们需要研究迁移学习?