hhh... 我又来写题解了

solution

题意简化

一个字符串,将所有的 _ 替换成大写字母,使结果字符串符合要求:

1、不包含三个连续 元音 或 辅音 字母;

2、字符串中至少有一个 L

求最终字符串可能的个数。


看到这道题,即想到了万能的算法——搜索。

从下标 \(0\) 开始,枚举每一个字母。

由于每次枚举的字母与后面的枚举无关,所以这样搜索不会出现重复的终串。

在枚举结束时使用 check 检测是不是合法终串,如果是就是一种情况。

注意:char 数组不会克隆,需要回溯。

#include#include<bits/stdc++.h>
using namespace std;
int yy[127]; int check(char ns[])
{
bool flag=0; for(int i=0,len=strlen(ns);i<len-2;i++)
{
if((yy[ns[i]]==1&&yy[ns[i+1]]==1&&yy[ns[i+2]]==1)
||
((!yy[ns[i]])&&(!yy[ns[i+1]])&&(!yy[ns[i+2]]))) return -1; if(!flag&&(ns[i]=='L'||ns[i+1]=='L'||ns[i+2]=='L')) flag=true;
}
return flag;
} long long dfs(int i,char ns[])
{
if(i==strlen(ns)) return max(check(ns),0);
if(check(ns)==-1) return 0;
if(ns[i]!='_') return dfs(i+1,ns); //这里可优化 ;;虽然对结果没啥影响 long long ans=0;
for(char ch='A';ch<='Z';ch++)
{
ns[i]=ch;
ans+=dfs(i+1,ns);
}
ns[i]='_';
return ans;
} int main()
{
//init
yy['A']=yy['E']=yy['I']=yy['O']=yy['U']=1;
yy['_']=-1; char chr[1001];
scanf("%s",chr);
cout<<dfs(0,chr);
return 0;
}1

可惜,只会拿到可怜的 \(30\%\) 的分数。

先来算算时间复杂度吧。

对于每次操作,都有每个 _ 需要枚举 \(26\) 次,保证最多有 \(10\) 个,所以枚举次数最少 \(10^{26}\) 次方,超时是稳稳的。

所以如何减少时间复杂度呢?

我们可以发现,这道题实际上辅音字母之间并没有区别。同理,对于元音字母也是如此。

所以,可以每次只枚举两次,对于辅音字母的结果乘 \(26-5=21\);元音字母的结果乘 \(5\)。

还有一点要注意,由于 L 会影响结果,所以需要特殊考虑。

总共 \(3\) 次,枚举次数降为 \(10^3\) ,AC 稳稳的。

AC Code:

#include<bits/stdc++.h>
using namespace std;
int yy[127]; int check(char ns[])
{
bool flag=0; for(int i=0,len=strlen(ns);i<len-2;i++)
{
if((yy[ns[i]]==1&&yy[ns[i+1]]==1&&yy[ns[i+2]]==1)
||
((!yy[ns[i]])&&(!yy[ns[i+1]])&&(!yy[ns[i+2]]))) return -1; if(!flag&&(ns[i]=='L'||ns[i+1]=='L'||ns[i+2]=='L')) flag=true;
}
return flag;
} long long dfs(int i,char ns[])
{
int len=strlen(ns);
while(ns[i]!='_'&&i<len) i++; //可优化递归层数,可惜只有100,没啥用
if(i==len) return max(check(ns),0);
if(check(ns)==-1) return 0; long long ans=0;
ns[i]='A'; //这里泛指元音字母
ans+=dfs(i+1,ns)*5;
ns[i]='B'; //这里泛指辅音字母
ans+=dfs(i+1,ns)*20; //将 L 特殊考虑,21-1 即为 20
ns[i]='L';
ans+=dfs(i+1,ns);
ns[i]='_';
return ans;
} int main()
{
//init
yy['A']=yy['E']=yy['I']=yy['O']=yy['U']=1;
yy['_']=-1; char chr[1001];
scanf("%s",chr);
cout<<dfs(0,chr);
return 0;
}

从 9 s 降到 30ms,质的提升啊!


求过!

洛谷 P7541 DOBRA 题解的更多相关文章

  1. 洛谷NOIp热身赛题解

    洛谷NOIp热身赛题解 A 最大差值 简单树状数组,维护区间和.区间平方和,方差按照给的公式算就行了 #include<bits/stdc++.h> #define il inline # ...

  2. 洛谷P2827 蚯蚓 题解

    洛谷P2827 蚯蚓 题解 题目描述 本题中,我们将用符号 ⌊c⌋ 表示对 c 向下取整. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现 ...

  3. 洛谷P1816 忠诚 题解

    洛谷P1816 忠诚 题解 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人 ...

  4. [POI 2008&洛谷P3467]PLA-Postering 题解(单调栈)

    [POI 2008&洛谷P3467]PLA-Postering Description Byteburg市东边的建筑都是以旧结构形式建造的:建筑互相紧挨着,之间没有空间.它们共同形成了一条长长 ...

  5. [NOI 2020 Online] 入门组T1 文具采购(洛谷 P6188)题解

    原题传送门 题目部分:(来自于考试题面,经整理) [题目描述] 小明的班上共有 n 元班费,同学们准备使用班费集体购买 3 种物品: 1.圆规,每个 7 元. 2.笔,每支 4 元. 3.笔记本,每本 ...

  6. [洛谷P3948]数据结构 题解(差分)

    [洛谷P3948]数据结构 Description 最开始的数组每个元素都是0 给出n,opt ,min,max,mod 在int范围内 A: L ,R ,X 表示把[l,R] 这个区间加上X(数组的 ...

  7. [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)

    [CodePlus 2017 11月赛&洛谷P4058]木材 Description 有 n棵树,初始时每棵树的高度为 Hi ,第 i棵树每月都会长高 Ai.现在有个木料长度总量为 S的订单, ...

  8. 洛谷P1189 SEARCH 题解 迭代加深

    题目链接:https://www.luogu.com.cn/problem/P1189 题目大意: 给你一个 \(n \times m\) 的矩阵,其中有一些格子可以走,一些各自不能走,然后有一个点是 ...

  9. 洛谷 P5221 Product 题解

    原题链接 庆祝!第二道数论紫题. 推式子真是太有趣了! \[\prod_{i=1}^n \prod_{j=1}^n \frac{\operatorname{lcm}(i,j)}{\gcd(i,j)} ...

随机推荐

  1. Python - 面向对象编程 - 实例方法、静态方法、类方法

    实例方法 在类中定义的方法默认都是实例方法,前面几篇文章已经大量使用到实例方法 实例方法栗子 class PoloBlog: def __init__(self, name, age): print( ...

  2. xv6学习笔记(5) : 锁与管道与多cpu

    xv6学习笔记(5) : 锁与管道与多cpu 1. xv6锁结构 1. xv6操作系统要求在内核临界区操作时中断必须关闭. 如果此时中断开启,那么可能会出现以下死锁情况: 进程A在内核态运行并拿下了p ...

  3. 了解Flask

    了解Flask 什么是Flask Flask 是一个微框架(Micro framework),所谓微框架,它就是很轻量级的,作者划分出了Flask应该负责什么(请求路由.处理请求.返回响应).不应该负 ...

  4. rabbitMq可靠消息投递之交换机备份

    //备份队列 @Bean("alternate_queue") public Queue alternate_queue() { return new Queue("al ...

  5. 这些经常被忽视的SQL错误用法,你有没有踩过坑?

    之前已经讲过mysql的性能优化,感兴趣的朋友可以看看之前的文章,<史上最全的MySQL高性能优化实战总结!>.但是有些问题其实是我们自身的SQL语句有问题导致的.今天就来总结哪些经常被我 ...

  6. Kubernetes集群部署笔记

    本作品由Galen Suen采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可.由原作者转载自个人站点. 概述 本文用于整理基于Debian操作系统使用kubeadm工具部署Kub ...

  7. 程序挂了之后别再跟我说让我帮你重启啦! 让supervisor帮你搞定...

    目录 有啥用? 安装 生成配置文件 启动supervisor 自定义配置文件 控制命令 求关注啦 有啥用? 很多我们项目排期进入联调.测试阶段,如果QA同学是直接跟你要一个后端环境的话,那简单点大概率 ...

  8. 关于ES6中Promise的应用-顺序合并Promise,并将返回结果以数组的形式输出

    1.Promise 基础知识梳理 创建一个Promise实例 const promise = new Promise(function(resolve, reject) { if (success){ ...

  9. Eclipse中安装配置Gradle

    Gradle是以Groovy语言为基础,面向Java应用为主.基于DSL(领域特定语言)语法的自动化构建工具. gradle对多工程的构建支持很出色,工程依赖是gradle的第一功能. gradle支 ...

  10. Linux触摸驱动分析

    测试平台 宿主机平台:Ubuntu 12.04.4 LTS 目标机:Easy-ARM IMX283 目标机内核:Linux 2.6.35.3 触摸屏基础知识 一.结构 上图是电阻触摸屏的一个侧面剖视图 ...