题目描述
如果一个键坏了,那么点它一次就会出现连续k个字符。现在给出k和一个字符串,求坏键(按输入的次序)和原本应该输出的字符串(假设坏键没坏的时候)
思路
由于字符顶多有256个,故设置两个bool数组marked[L],printed[L]分别来标志某个键是否为坏键、是否被输出过。
首先初始化所有键都是坏键,所有坏键都未被输出过。
遍历输入数组,当某个键连续出现的次数不是k的整数倍,说明该键一定不是坏键,将marked[i]置为false。
再遍历一次数组输出坏键和原本应该输出的字符串。
#include <bits/stdc++.h>
#define L 256
bool marked[L],showed[L],printed[L];
//某个键是否为坏键、是否出现、是否被输过。
using namespace std;
int main()
{
int k;
cin>>k;
string s;
cin>>s;
fill(marked,marked+L,true);
fill(showed,showed+L,false);
fill(printed,printed+L,false);
//遍历得到的坏键和显示的键
int len=(int)s.length();
for(int i=0;i<len;)
{
int j=i+1;
int code=s[i];
while(j<len&&s[j]==s[j-1])j++;
if((j-i)%k!=0) marked[code]=false;//该键一定不是坏键
showed[code]=true;//该键出现过
i=j;
}
//边遍历得到结果字符串ans边输出坏键
string ans;
for(int i=0;i<len;)
{
int code=s[i];
ans+=code;
if(marked[code])//是坏键
{
i+=k;
if(!printed[code])//该坏键没被输出过
{
cout<<(char)code;
printed[code]=true;
}
}
else i++;
}
cout<<endl;
cout<<ans;
return 0;
}