题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805357933608960

这道题初次写的时候,思路也就是考虑从头到尾遍历一遍,然后如果一个字符重复出现k的倍数次的话,那么这个键就是坏的。

但是这样做交了一发是错的。

后来一想,如果 k = 3,然后出现了aaaba这样一个字符串,那我们并不能仅仅凭a出现了3次就认为a是一个坏键,因为如果它是坏键,那么每一次它在字符串中出现的时候出现的次数都会是k的倍数。

所以思路就变得稍微复杂一些了,用c++ stl中的set来辅助一下,多遍历一遍,第一遍遍历,将出现了k的倍数次的字符放进set中,第二次遍历,如果该字符在set中,并且该字符在某处连续出现的次数不是k的倍数,就可以判断它肯定不是坏键,则要将其取出set。set中的元素表示的就是坏键。

最后再遍历一遍,按照这些字符在字符串中出现的顺序,将坏键放入数组中。

最后一遍遍历,输出原序列。也就是对于坏键,只输出一次,然后就跳过那些因为坏键而多输出的字符,继续输出下面的字符即可。

至于如何求某个字符在某个位置连续出现的长度,就像上一篇博客,天梯赛L1-058 6翻了 一样,从后往前扫一遍,如果s【i】 == s【i+1】,那么a【i】= a【i+1】,否则a【i】就直接等于1。

代码题解:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 100005;
const int INF = 0x3f3f3f3f;
int k,N,mlen = INF;
string s;
int a[1005];
char seq[1005],p[1005];
int cnt = 0,num = 0;
set<char> ss,aa;
int main(){
#ifndef ONLINE_JUDGE
// freopen("in.txt","r",stdin);
#endif
scanf("%d",&k);
cin>>s;
int len = s.length();
a[len-1] = 1;
for(int i=len-2;i>=0;i--){
if(s[i] == s[i+1]) a[i] = a[i+1] + 1;
else a[i] = 1;
}
for(int i=0;i<len;){
if(a[i] % k == 0){
aa.insert(s[i]);
i += a[i];
}
else i++;
}
for(int i=0;i<len;){
if(aa.count(s[i])){
if( a[i] % k != 0 )
aa.erase(s[i]);
i += a[i];
}
else i++;
}
for(int i=0;i<len;){
p[num++] = s[i];
if(aa.count(s[i])){
if(!ss.count(s[i])){
ss.insert(s[i]);
seq[cnt++] = s[i];
}
i += k;
}
else i++;
}
for(int i=0;i<cnt;i++){
cout<<seq[i];
}cout<<endl;
for(int i=0;i<num;i++){
cout<<p[i];
}cout<<endl;
return 0;
}

PAT甲级 1112 Stucked Keyboard的更多相关文章

  1. PAT甲级——1112 Stucked Keyboard (字符串+stl)

    此文章同步发布在我的CSDN上:https://blog.csdn.net/weixin_44385565/article/details/90041078   1112 Stucked Keyboa ...

  2. PAT 甲级 1112 Stucked Keyboard

    https://pintia.cn/problem-sets/994805342720868352/problems/994805357933608960 On a broken keyboard, ...

  3. PAT甲级——A1112 Stucked Keyboard【20】

    On a broken keyboard, some of the keys are always stucked. So when you type some sentences, the char ...

  4. PAT 1112 Stucked Keyboard

    1112 Stucked Keyboard (20 分)   On a broken keyboard, some of the keys are always stucked. So when yo ...

  5. PAT 1112 Stucked Keyboard[比较]

    1112 Stucked Keyboard(20 分) On a broken keyboard, some of the keys are always stucked. So when you t ...

  6. 1112 Stucked Keyboard (20 分)

    1112 Stucked Keyboard (20 分) On a broken keyboard, some of the keys are always stucked. So when you ...

  7. 【刷题-PAT】A1112 Stucked Keyboard (20 分)

    1112 Stucked Keyboard (20 分) On a broken keyboard, some of the keys are always stucked. So when you ...

  8. 【PAT甲级】1112 Stucked Keyboard (20分)(字符串)

    题意: 输入一个正整数K(1<K<=100),接着输入一行字符串由小写字母,数字和下划线组成.如果一个字符它每次出现必定连续出现K个,它可能是坏键,找到坏键按照它们出现的顺序输出(相同坏键 ...

  9. PAT甲题题解-1112. Stucked Keyboard (20)-(map应用)

    题意:给定一个k,键盘里有些键盘卡住了,按一次会打出k次,要求找出可能的坏键,按发现的顺序输出,并且输出正确的字符串顺序. map<char,int>用来标记一个键是否为坏键,一开始的时候 ...

随机推荐

  1. QPainter::begin: Paint device returned engine == 0, type: 1

    开始 使用QPainter画图,需要继承QWidget,重写paintEvent()虚函数,在里面进行绘图. 或者可以考虑绘制到QImage或者QPixmap上面,然后在paintEvent()里面调 ...

  2. POJ 2506 Tiling dp+大数 水题

    大致题意:现有两种方块(1X2,2X2),方块数量无限制.问用这两种方块填满2Xn的矩阵的填法有多少种. 分析:通俗点说,找规律.专业化一点,动态规划. 状态d[i],表示宽度为i的填法个数. 状态转 ...

  3. 使用 K6 来给你的服务做一次负载和压力测试吧

    前言 负载测试,压力测试可以衡量服务是否是一个高可用,高性能的服务.负载测试能检验在不同的工作负荷下,服务的硬件消耗和响应,从而得到不同负载情况下的性能指标.压力测试能检验软硬件环境下服务所能承受的最 ...

  4. 浅读tomcat架构设计之Pipeline-Valve管道(4)

    tomcat Container容器处理请求是使用Pipeline-Valve管道来处理的,后续写的tomcat内存马,和他紧密结合 Pipeline-Valve是责任链模式,责任链模式是指在一个请求 ...

  5. php错误处理,自动加载,以及栈堆内存和运行模式堆浅解 (转)

    Php错误处理 Php错误级别: E_ERROR 致命错误,会终止脚本运行.值为1 E_WARNING 警告错误,给出提示,不会终止运行值为2 E_PARSE 编译时的语法解析错误,解析错误仅仅由分析 ...

  6. 什么是BSE

    BSE (bridge system engineer) 是外包开发人员和客户之前的桥梁. 主要是将客户的需求准确的理解并传达给外包的开发人员,一般情况下也兼开发的 leader 工作. 参考: ht ...

  7. webpack(10)webpack-dev-server搭建本地服务器

    前言 当我们使用webpack打包时,发现每次更新了一点代码,都需要重新打包,这样很麻烦,我们希望本地能搭建一个服务器,然后写入新的代码能够自动检测出来,这时候就需要用到webpack-dev-ser ...

  8. SEO入门一篇就够-SEO教程

    大家口中的SEO(Search Engine Optimization),中文翻译为"搜索引擎优化",从本质上来说,其实就是如何迎合搜索引擎的规则,使得网站在搜索结果中能有更好的排 ...

  9. 使用.net Core 3.1 多线程读取数据库

    第一步:先创建一个DBhepler类,作为连接数据库中心,这个不过多说明,单纯作为数据库的连接........... 1 public static string Constr = "数据库 ...

  10. C语言:地址

    一切都是地址 C语言用变量来存储数据,用函数来定义一段可以重复使用的代码,它们最终都要放到内存中才能供 CPU 使用.数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存到底存储的是 ...