这个题卡了好久..
之前没有理解好题意,卡住的一定是卡N次,如果那个按键有没有重复N次的情况就不算卡住。
我是靠不相同的时候判定重复次数的,这时候会出现一个特例,末尾是连续的。
例如:
3
aaaeee
这个时候末尾没有不相同的了。所以追加了一个单独的判定。
#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <set>
#include <map>
using namespace std;
int n;
string s;
queue <char> q;
bool isVis[256];
bool NotStack[256];
bool isAns[256];
int main() {
cin >> n >> s;
memset(isVis, false, sizeof(isVis));
memset(NotStack, false, sizeof(NotStack));
memset(isAns, false, sizeof(isAns));
int p = 1, pre = 0;
int times = 1;
//遍历整个字符串 确定可能的串
while (p < s.size()) {
if (s[p] != s[pre]){
if ((p - pre) % n == 0 && !isVis[int(s[pre])]) {//可能卡住且没有访问过
q.push(s[pre]);
isVis[int(s[pre])] = true;
}
pre = p;
}
if (p == s.size() - 1 && s[p] == s[pre] && (p - pre + 1) == n && !isVis[int(s[pre])]) {//最后一个单独处理
//例如3 aaaeee最后一个不相同不会判定出来
q.push(s[pre]);
isVis[int(s[pre])] = true;
}
p++;
}
//遍历整个字符串 排除没有卡住的
p = 1, pre = 0;
while (p < s.size()) {
if (s[p] != s[pre]) {
if ((p - pre) % n != 0) {//没有卡住
NotStack[int(s[pre])] = true;
}
pre = p;
}
p++;
}
//剔除没有卡住的键
vector <char> fin;
while (!q.empty()) {
if (!NotStack[int(q.front())]) {
fin.push_back(q.front());
isAns[int(q.front())] = true;
}
q.pop();
}
//输出
for (int i = 0; i < fin.size(); i++) {
cout << fin[i];
}
cout << endl;
for (int i = 0; i < s.size();i++) {
cout << s[i];
if (isAns[int(s[i])]) {
i = i + n - 1;
}
}
return 0;
}