美团杯:签到题
我:一个小时自闭题

查查查乐乐

【题目】

“查查查乐乐”是一段古老神秘的咒语,只有被选中的魔法师才有资格使用这一段咒语并享用它所带来的力量;而如果这段咒语出现在了不具资格的魔法师的口中,这个魔法师将会遭到咒语的反噬并付出可怕的代价。

这个学期,镁团在一家魔法早教学校做兼职,他的任务是教小学生们魔法并帮助他们准备一年一度的全国魔法奥林匹克竞赛 (NOMP)。今天,镁团在整理图书的时候,突然发现一本课外教材中包含了 tt 段只由查和乐组成的咒语。让小学生们阅读这些咒语是非常危险的:他们可能会在无意识中念出“查查查乐乐”。

因此,作为一名富有责任心的儿童教师,镁团打算修改这些咒语,从而最大程度地杜绝这方面的隐患。镁团认为一段由查和乐组成的咒语是危险的当且仅当在删去咒语中的若干个字(也可以不删)后,剩下的咒语可能变成查查查乐乐。举例来说,“查查查乐乐”,“查查乐查乐乐” 就是危险的,而 “乐乐查查查”,“乐查乐乐查乐查查”就不是危险的。

对于每一段咒语,镁团都可以选择若干个位置并对这些位置进行修改:他可以把“查”变成“乐”,也可以把“乐”变成“查”。为了最大限度地保留教学效果,镁团希望使用尽可能少的修改来消除所有的危险性:对于每一段咒语,镁团都希望你帮他计算一下最少的修改次数。

输入格式
输入第一行是一个整数 t(1≤t≤1000),表示咒语的数量。

对于每组数据,输入包含一行一个只包含字符 x 和 l 的字符串 s(1≤|s|≤100),描述了一段咒语。其中 x 表示“查”,l 表示 “乐”。

输出格式
对于每段咒语,输出一行一个整数表示最少的修改次数。

样例一
input

3
xxxll
xxlxllllxl
xxxxxlllll

output

1
1
3

【题意翻译】
一个只包含x与l的串。修改一些(或不修改),修改是把x改成l,l改成x,使得最后串的子串(在原串删除几个字符或不删除)不包含xxxll

【思路】
既然是修改,那优先修改肯定是最左边的x改成l,最右边的l改成x是最佳修改的。不然如果中间有一些修改之后,可能又会在某个子串里有xxxll了。

我们使用两个后缀数组
hz[i]表示下标i与其之后含有多少个l
hz[i]2表示下标i与其之后含有多少个x

接下来我们从左到右遍历。如果当前下标为i,然后考虑一些修改方法。
比较简单易得的有:如果hz2[i]<=1,表示后面两个l都没有,跳出。
然后我们再考虑修改x还是修改l。

【1】如果我们当时选择了这三个x,那么其前面的b个x都要修改成l,并且之后的c个l要修改到只剩下1个l。

【2】如果我们选择只修改x,那么只要把前面a个x、后面b个x与选择的这三个其一修改成l即可。(这一步可以单独拎出来,因为答案就是x的个数-2,当然要注意不能小于0)

我们只要用cnt记录一下当前有几个x了。如果cnt为3了,我们需要判断上面的两个方法,不断更新答案的最小值。然后就像尺取一样,我们舍弃掉最左边的x,cnt变为2,继续遍历该数组。

时间复杂度O(N)

AC代码:

#include <bits/stdc++.h>
#define show(x) std::cerr << #x << "=" << x << std::endl
#define IOS ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
using namespace std;
typedef long long ll;
const int MAX=120;
const int INF=1e9;
const double EPS = 0.00000001;
const ll MOD=998244353;
string aa;
int hz[MAX];        ///后缀l的个数
int hz2[MAX];       ///后缀x的个数
int main()
{IOS;int T;cin >> T;while(T--){cin >> aa;memset(hz,0,sizeof(hz));memset(hz2,0,sizeof(hz2));for(int i=aa.size()-1;i>=0;--i){hz[i]=hz[i+1];if(aa[i]=='l')hz[i]++;hz2[i]=hz2[i+1];if(aa[i]=='x')hz2[i]++;}int cnt=0,you=0;;int ans=INF;for(int i=0;i<aa.size();++i){if(aa[i]=='l'){continue;}cnt++;if(cnt==3){if(hz[i]<=1){              ///break可以算的更快些ans=min(ans,you);break;}else{ans=min(ans,you+hz[i]-1);        ///修改前面x与后面lans=min(ans,you+hz2[i]-1+1); ///修改前面x与后面x}cnt--;you++;}}if(ans==INF)ans=0;cout << ans << endl;}return 0;
}

真的签到题吗???

【美团杯2020】字符串处理:查查查乐乐相关推荐

  1. 美团杯2020:查查查乐乐(dp)

    A. [美团杯2020]查查查乐乐 "查查查乐乐"是一段古老神秘的咒语,只有被选中的魔法师才有资格使用这一段咒语并享用它所带来的力量:而如果这段咒语出现在了不具资格的魔法师的口中, ...

  2. 美团杯2020 - 半前缀计数(后缀自动机)

    题目链接:点击查看 题目大意: 蒜斜刚来PKU的时候还不知道有"北大算协"这个社团,因此他总是觉得周围的人在偷偷议论着他,比如说: "算协(注:非蒜斜)举办的活动好有趣啊 ...

  3. 美团杯2020 - 平行四边形(原根)

    题目链接:点击查看 题目大意: 蒜斜非常喜欢下围棋.自从AlphaOg面世以来,他就立志一定要研究出AlphaOg的破绽. 终于,他发现当AlphaOg遇到一种特殊局面后,它的神经网络会自动输出&qu ...

  4. 【美团杯2020】114514 解题报告

    原题地址:http://uoj.ac/contest/53/problem/529 这题说实话我觉得有点玄学.我的方法是从左到右贪心,优先给每个4分配两个1,1不够的时候就再取出来.虽然我也意识到思路 ...

  5. 【UOJ529】【美团杯2020】114514

    题目链接 点击打开链接 题目解法 可以发现,在给定的序列 114514 114514 114514 中,每个 4 4 4 之前均有一个 1 1 1 . 因此,从后向前,将每个 4 4 4 与前方最近的 ...

  6. [网鼎杯 2020 青龙组]jocker

    [网鼎杯 2020 青龙组]jocker SMC(self-Modifying Code): 自修改代码,程序在执行某段代码的过程中会对程序的代码进行修改,只有在修改后的代码才是可汇编,可执行的.在程 ...

  7. [网鼎杯 2020 朱雀组]Think Java

    [网鼎杯 2020 朱雀组]Think Java 文章目录 [网鼎杯 2020 朱雀组]Think Java 获取源文件 Swagger JDBC sql注入 关于#的使用 查看数据库名字 获取表名 ...

  8. 美团点评2020年测试工程师笔试题

    VOL 155 04 2020-09 今天距2021年118天 这是ITester软件测试小栈第155次推文 点击上方蓝字"ITester软件测试小栈"关注我,每周一.三.五早上  ...

  9. 纵横杯2020 web wp

    title: 纵横杯2020 web wp date: 2020-12-26 18:19:03 tags: CTF categories: 比赛 link:https://yq1ng.github.i ...

最新文章

  1. MyEclipse 编写 ExtJS 卡死问题解决方法
  2. 【PAT甲级 前导0,排序】1069 The Black Hole of Numbers (20 分) C++ 全部AC
  3. 第一次作业--四则运算题目生成程序
  4. PHP优于Node.js的五大理由
  5. 美哭了,一款面向程序员的开源 Markdown 笔记工具!
  6. OFDM 调制系统框图 OFDM
  7. AutoCAD快捷键大全
  8. YOLOV3--训练数据+视频检测
  9. 13 个 Mongodb GUI 可视化管理工具,总有一款适合你
  10. oracle如何恢复表中删除的数据?
  11. java addlast_java linkedlist addlast()不能指定元素追加在此列表的末尾
  12. oracle矩阵转置,法线变换、逆转置、伴随转置
  13. getUserMedia API及HTML5 调用手机摄像头拍照
  14. 30个高质量的数据集网站,你必须要试试!
  15. 为什么华为手机总有不明照片?赶紧查看一下这3个功能,尽快关闭
  16. 第十九章 蚂蚁靠什么绊倒大象
  17. wifi softap(hotspot) porting
  18. Leetcode典型题解答和分析、归纳和汇总——T155(最小栈)
  19. 计算机工作模式s0 s1,电源选项中S0,S1,S2,S3,S4,S5的含义.docx
  20. 您的系统管理员不允许访问家庭组的解决方法

热门文章

  1. linux跳板机权限管理,开源跳板机(堡垒机)Jumpserver v0.2.0 使用说明
  2. sklearn期望方差explained_variance_score
  3. 静电测试耦合板电阻作用
  4. 【论文阅读】OUTRAGEOUSLY LARGE NEURAL NETWORKS: THE SPARSELY-GATED MIXTURE-OF-EXPERTS LAYER
  5. 自媒体人日常必看的7个运营学习网站,记得收藏起来
  6. windows c++程序在崩溃时自动生成dump
  7. 携职教育:国家认可的中级职称有哪些?哪个中级职称最容易考呢?
  8. 因为计算机中丢失pff,PFF文件扩展名 - 什么是.pff以及如何打开? - ReviverSoft
  9. Drony配合Charles实现App定向抓包
  10. Windows更新+中间人=远程命令执行