又死在对题意的理解上啊,The stucked key will always repeat output for a fixed k times whenever it is pressed.(那啥我有注意到这个fixed 可是解题的时候粗心了)
“fixed k times”
比如,字符串"1111qqqqq_tqeeee__bpacddddaddddd"输入4的话正确的输出确实是1和e
还有一种情况就是,可能出现一个键先被判断为不是坏键,后被判断为坏键的情况,如下:
输入
4
11111_ass_1111_1111
这里的1不是坏键(因为1一开始就出现5次,可以判断为非坏键)
3
caseee1__thiiis_iiisss_a_teeeeeest (因为s前面出现了1次,所以s被判断为非坏键,坏件为e、i)
一开始的错误代码,如下:
测试点2,4答案错误的原因如下:看个测试用例你就懂了
3
caseee
坏键为e,循环结束的位置应该是字符串最后一个位置的下一个位置。
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
int k, i = 0;
string str, rep, temp;
bool vis[128] = { false };
map<char, int> mp;
int main() {
cin >> k >> str;
while(i < str.size()) {
temp = str.substr(i, k);
if(count(temp.begin(), temp.end(), str[i]) == k) {
mp[str[i]] ++;
i += 3;
} else i++;
}
for(auto it : str) {
if(mp[it] >= 2 && vis[it] == false) {
cout << it;
vis[it] = true;
}
}
for(int i = 0; i < str.size(); i++) {
temp = str.substr(i, k);
if(count(temp.begin(), temp.end(), str[i]) == k && mp[str[i]] >= 2) {
rep = str[i];
str.replace(i, k, rep);
}
}
cout << endl << str;
return 0;
}
AC代码(如果理解清楚了题目意思,还是很简单的)
#include<iostream>
#include<unordered_map>
using namespace std;
int n, k = 1;
string str;
unordered_map<char, int> mp;
unordered_map<char, bool> sureNoBroken;
bool vis[128] = {false};
int main() {
cin >> n >> str;
char pre = '#';
str = str + "#"; // -------
for(int i = 0; i < str.length(); i++) {
if(str[i] == pre) k++;
else {
if(k % n == 0) mp[pre] ++;
else sureNoBroken[pre] = true;
pre = str[i];
k = 1;
}
}
for(int i = 0; i < str.length(); i++) {
if(mp[str[i]] && vis[str[i]] == false && sureNoBroken[str[i]] == false) {
cout << str[i];
vis[str[i]] = true;
}
}
cout << endl;
string result;
for(int i = 0; i < str.length() - 1; i++) {
result += str[i];
if(vis[str[i]]) i += n - 1;
}
cout << result;
return 0;
}
柳神代码
#include<iostream>
#include<unordered_map>
#include<set>
using namespace std;
int n, k = 1;
string str;
unordered_map<char, bool> sureNoBroken,m;
set<char> s;
int main() {
cin >> n >> str;
char pre = '#';
str = str + "#";
for(int i = 0; i < str.length(); i++) {
if(str[i] == pre) k++;
else {
if(k % n) sureNoBroken[pre] = true;
k = 1;
}
if(i != str.length() - 1) m[str[i]] = (k % n == 0);
pre = str[i];
}
for(int i = 0; i < str.length() - 1; i++)
if(sureNoBroken[str[i]]) m[str[i]] = false;
for(int i = 0; i < str.length(); i++) {
if(m[str[i]] && s.find(str[i]) == s.end()) {
cout << str[i];
s.insert(str[i]);
}
}
cout << endl;
for(int i = 0; i < str.length() - 1; i++) {
cout << str[i];
if(m[str[i]]) i = i + n - 1;
}
return 0;
}