1112 Stucked Keyboard

#include<iostream>

#include<map>

#include<set>

#include<string>

using namespace std;

bool sureNobroken[256];

int main(){

int k,cnt=1;

cin>>k;//字符出现次数的阈值

string s;

cin>>s;

map<char,bool>m;//记录是否为坏键

set<char>printed;//记录已经输出的字符

char pre='#';

s=s+'#';

//第一次遍历,标记可能坏掉的键

for(int i=0;i<s.length();i++){

if(s[i]==pre){

cnt++;

}else{

//如果连续出现的不是k的倍数,说明不是坏键

if(cnt%k!=0){

sureNobroken[pre]=true;

}

cnt=1;

}

//如果当前出现的字符数是k的倍数,表示其为坏键

if(i!=s.length()-1){

m[s[i]]=(cnt%k==0);

}

pre=s[i];//更新前一个字符

}

//第二次遍历,修正标记

for(int i=0;i<s.length()-1;i++){

if(sureNobroken[s[i]]){

m[s[i]]=false;

}

}

//输出所有坏键

for(int i=0;i<s.length()-1;i++){

if(m[s[i]]&&printed.find(s[i])==printed.end()){

cout<<s[i];

printed.insert(s[i]);

}

}

cout<<endl;

//输出修正后的字符

for(int i=0;i<s.length()-1;i++){

cout<<s[i];

if(m[s[i]]){

i=i+k-1;

}

}

return 0;

}

相关推荐
用户0203388613145 分钟前
红黑树主要功能实现
算法
꧁Q༒ོγ꧂6 分钟前
C++ 入门完全指南(六)--指针与动态内存
开发语言·c++
永远不打烊6 分钟前
c++ 11 之 并发与多线程
c++
专注VB编程开发20年10 分钟前
压栈顺序是反向(从右往左)的,但正因为是反向压栈,所以第一个参数反而离栈顶(ESP)最近。
java·开发语言·算法
Xの哲學10 分钟前
Linux Select 工作原理深度剖析: 从设计思想到实现细节
linux·服务器·网络·算法·边缘计算
say_fall15 分钟前
C++ 类与对象易错点:初始化列表顺序 / 静态成员访问 / 隐式类型转换
android·java·开发语言·c++
Paul_092029 分钟前
golang编程题
开发语言·算法·golang
颜酱34 分钟前
用填充表格法-继续吃透完全背包及其变形
前端·后端·算法
夏秃然37 分钟前
打破预测与决策的孤岛:如何构建“能源垂类大模型”?
算法·ai·大模型
ChoSeitaku41 分钟前
16.C++入门:list|手撕list|反向迭代器|与vector对比
c++·windows·list