PAT A1112(测试点1,2,3,4答案错误)

又死在对题意的理解上啊,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;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值