一、题目描述
Input Specification:
Output Specification:
Sample Input:
3
caseee1__thiiis_iiisss_a_teeeeeest
Sample Output:
ei
case1__this_isss_a_teest
二、解题思路
利用一个unordered_map存放错误字符被检测到的顺序,对于正常字符则设为-1,遍历原来的字符串更新这个unordered_map。随后遍历这个unordered_map,如果对应的数字大于0,则将该字符存入ans中,按照被发现的顺序排序,最后遍历原字符串进行判断输出即可。具体细节可见代码注释。
三、AC代码
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<unordered_map>
using namespace std;
unordered_map<char, int> mp; //用于存放每个每个字符被检测到的顺序,如果没被检测过就是0,被检测正常则设为-1
bool cmp(char a, char b) //按照存放顺序排序
{return mp[a] < mp[b];}
int main()
{
int K;
string str;
scanf("%d", &K);
cin >> str;
int order = 1;
for(int i=0; i<str.size()-1; )
{
int cnt = 1; //表示重复的个数
while(str[i] == str[i+1]) //如果重复,cnt++,i++
{
cnt++;
i++;
}
if(mp[str[i]] == 0 && cnt%K == 0) mp[str[i]] = order++; //填入被检测的顺序
else if(cnt%K != 0) mp[str[i]] = -1; //如果出现某一字符重复次数不是k的整数倍,则这个字符必然不是坏掉的那个按键
i++;
}
string ans = "";
for(auto it : mp)
{
if(it.second > 0) ans += it.first; //ans存放发生错误的字符
}
sort(ans.begin(), ans.end(), cmp); //按照被检测的顺序排序
cout << ans << endl;
for(int i=0; i<str.size(); ) //遍历原来的字符串,遇到错误的就只输出一次,无错误的就正常输出
{
if(mp[str[i]] > 0)
{
cout << str[i];
i += K;
}
else
{
cout << str[i];
i++;
}
}
return 0;
}