题目: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 }