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. 线程间协作的两种方式:wait、notify、notifyAll和Condition

    转载自海子: 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者 ...

  2. session.flush与transaction.commit

    以session的save方法为例来看一个简单.完整的事务流程,如下是代码片段: ---------------------------- Session session = sessionFacto ...

  3. CSS截取字段,让过长的字段结尾变成省略号(IE有效)

    text-overflow:ellipsis;overflow:hidden;<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transiti ...

  4. RTSP H264/HEVC 流 Wasm 播放

    本文将介绍 RTSP H264/HEVC 裸流如何于网页前端播放.涉及 WebSocket 代理发送流数据, Wasm 前端解码等. 代码: https://github.com/ikuokuo/rt ...

  5. Redis的配置文件

  6. JS_DOM操作之绑定事件

    1 - 静态绑定:直接把事件写在标签元素中 <div id="div" onclick="foo(this)">click</div> ...

  7. WHY IS A BYTE 8 BITS? OR IS IT?

    WHY IS A BYTE 8 BITS? OR IS IT? 原文链接:http://www.bobbemer.com/BYTE.HTM I recently received an e-mail ...

  8. Python - 面向对象编程 - 实战(6)

    需求 设计一个培训机构管理系统,有总部.分校,有学员.老师.员工,实现具体如下需求: 有多个课程,课程要有定价 有多个班级,班级跟课程有关联 有多个学生,学生报名班级,交这个班级对应的课程的费用 有多 ...

  9. WEB安全性测试之文件上传漏洞

    1.漏洞描述:文件上传漏洞,是指可以利用WEB上传一些特定的文件包含特定代码如(<?php phpnfo;?> 可以用于读取服务器配置信息.上传成功后可以点击) 上传漏洞是指用户上传了一个 ...

  10. VUE005. 在data中使用 / 改变data,或在data中调用method函数

    使用三方UI库时经常会遇到在data中写入方法的场景,如Element-UI的级联选择器(动态加载part)需要在data中写入lazyLoad. 但后端总会给出意想不到的需求: 通过接口调取一串数据 ...