前言

传送门

正文


参考题解

#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;
}