1112 Stucked Keyboard (20 分)

题目: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 }
原文地址:https://www.cnblogs.com/2020R/p/14417171.html