题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805357933608960
1 #pragma warning(disable:4996) 2 #define _CRT_SECURE_NO_WARNINGS 3 4 #include <iostream> 5 #include <map> 6 #include <set> 7 #include <string> 8 #include <cctype> 9 #include <stack> 10 #include <vector> 11 using namespace std; 12 13 int main() 14 { 15 int N; 16 cin >> N; 17 string s; 18 getchar(); 19 getline(cin, s);//可能会遇到空格,所以用getline读入,但是貌似直接读也能AC 20 int i = 0; 21 int cnt = 1; 22 map<char, bool> is;//是否是坏键 23 map<char, bool> finished;//标志不是坏键,只要出现重复次数cnt,有cnt%N!=0的情况,即可判断不是坏键 24 while (i < s.size()) 25 { 26 if (s[i] == s[i + 1] && i != s.size() - 1) 27 { 28 ++i; 29 ++cnt; 30 } 31 else 32 { 33 if (cnt % N == 0 && finished[s[i]] == false) 34 { 35 is[s[i]] = true; 36 } 37 else 38 { 39 finished[s[i]] = true; 40 is[s[i]] = false; 41 } 42 cnt = 1; 43 ++i; 44 } 45 } 46 i = 0; 47 vector<char>show; 48 set<char> sset; 49 for (int i = 0; i < s.size(); ++i)//顺序输出坏键处理 50 { 51 if (sset.find(s[i]) == sset.end() && is[s[i]]) 52 { 53 sset.insert(s[i]); 54 show.push_back(s[i]); 55 } 56 } 57 for (int i = 0; i < show.size(); ++i) 58 { 59 cout << show[i]; 60 } 61 cout << endl; 62 while (i < s.size()) 63 { 64 cout << s[i]; 65 if (is[s[i]]) 66 i += N; 67 else 68 ++i; 69 } 70 cout << endl; 71 return 0; 72 }