pat a 1112

耗尽温柔 提交于 2020-02-11 22:48:24

首先认为所有键都是好键
在遍历时把所用重复k次的挑出来利用unordered_map来记录(这里用的suspect),是坏键的记为1
用isnotbroken来记录一下谁一定是好键(例如至少一次重复次数少于n),以及我当初怀疑是坏键的其实某一次重复次数少于n,将是好键的记为1

处理完毕后是坏键的标志是suspect为1且isnotbroken为0
然后咱们再遍历一下,边遍历边把坏键放入一个set容器,边输出坏键
最后输出一下就好啦

#include <iostream>
#include <unordered_map>
#include <set>
using namespace std;

unordered_map<char,int> suspect,isnotbroken;

int main(){
	string str;
	int n;
	int lastcharnum=1;
	cin>>n>>str;
	int i=1;
	while(i<str.length()){
		while(str[i-1]==str[i]&&i<str.length()){
			lastcharnum++;
			i++;
		}
		if(suspect[str[i-1]]==1&&(lastcharnum%n!=0)){
			isnotbroken[str[i-1]]=1;
		}
		if(lastcharnum%n==0){
			suspect[str[i-1]]=1;
		}else{
			isnotbroken[str[i-1]]=1;
		}
		
		lastcharnum=1;
		i++;
	}
	set<char> se;
	for(int j=0;j<str.length();j++){
		if(suspect[str[j]]==1&&isnotbroken[str[j]]==0){
			if(se.find(str[j])==se.end()){
				printf("%c",str[j]);
				se.insert(str[j]);
			}
		}
	}
	printf("\n");
	for(int j=0;j<str.length();j++){
		printf("%c",str[j]);
		if(suspect[str[j]]==1&&isnotbroken[str[j]]==0){
			j=j+n-1;
		}
	}
	
	
	return 0;
} 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!