在一个损坏的键盘上,某些键总是被卡住。
因此,当你用该键盘输入一些句子时,与这些键相对应的字符将在屏幕上重复出现 kk 次。
现在,给定 k 以及最终屏幕显示的结果字符串,请你找出所有可能坏掉的按键,并给出原始字符串。
注意,有些字符可能被重复键入。
每当卡住的按键被按下时,其对应的字符将固定被输出 k次。
例如,当 k=3时,从字符串 thiiis iiisss a teeeeeest
,我们可以推断出 i
和 e
可能被卡住了,但是 s
并没有被卡住,尽管它也重复出现过。
所以,原始字符串可能是 this isss a teest
。
思路:用map<char,int>记录每个字符按键对应的好坏状态flag
遍历字符串,用cnt记录连续相同的字符个数,当遇到不相同的字符时,判断一下cnt是否是k的倍数,如果不是,说明该字符的按键是好好的,将flag置1。
第二次遍历,将所有坏的字符按键输出(即flag==0),并标记已输出(题目要求不重复输出)
第三次遍历,遇到好的字符直接输出,遇到坏的字符每k次输出一次
#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define INF 0x3f3f3f3f
using namespace std;
const int N=1e5+233;
int n,m,k;
unordered_map<char,int>flag,vis;
int main(){
string s;
cin>>k;
cin>>s;
int cnt=1;
rep(i,0,s.length()){
if(s[i]==s[i+1]) cnt++;
else{
if(cnt%k!=0) flag[s[i]]=1;
cnt=1;
}
}
rep(i,0,s.length())
if(!vis[s[i]]&&!flag[s[i]]){
cout<<s[i];
vis[s[i]]=1;
}
cout<<endl;
cnt=0;
rep(i,0,s.length()){
if(flag[s[i]]) cout<<s[i];
else{
cnt++;
if(cnt%k==0) cout<<s[i];
}
}
cout<<endl;
}