前言
正文
参考题解
#include<iostream>
#include<algorithm>
using namespace std;
/* 题意:当按下键盘上损坏的键时,键对应的字符会重复输出k次,现在给出k和输出的字符串, 要求出损坏的字符键是哪些,以及原始应该输出的字符串。 注意fill函数用法如下 fill(arr, arr + n, 要填入的内容); 思路:如果有一次连续出现不是k的倍数,则该键一定不是坏键,否则该键可能是坏键 注意: 尤其注意 3 aaa_a_fff 这种情况 最后结果输出 : f aaa_a_f */
const int N=256;
bool flag[N];//true表示已经出现过的键
int main(){
int k,i=0,len,j;
string str,keys,res,temp;
cin>>k>>str;
fill(flag,flag+N,false);
len=str.size();
//第一次遍历获取坏键是哪些
while(i<len){
j=i+1;
while(j<len&&str[j]==str[j-1])j++;
int num=j-i;//重复出现的字符个数
//注意需要先全部遍历一遍,得出所有的坏键后再遍历输出。
//否则第二个测试点,例如 3 aaa_a_fff 的样例就会出错
if(num%k!=0)flag[str[i]]=true;//一定不是坏键
i=j;
}
i=0;
//第二次遍历获取keys和res
while(i<len){
res+=str[i];
if(!flag[str[i]]){
if(keys.find(str[i])==string::npos)//该错误字符首次出现才加入到keys中
keys+=str[i];
i+=k;
}else i++;
}
cout<<keys<<endl<<res<<endl;
return 0;
}