这道题很坑的一点就是,有可能坏掉的键盘是空串(所有的键都是好的),如下测试用例
input
NULL
abcdefgoutput
abcdefg
所以,用字符串数组的不能直接用scanf("%s",str);读入,用string的也不能直接用cin读入
分别改为用cin.getline(str,length);和getline(cin,str)就好啦
本蒻姬代码又臭又长
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int vis[100],vis2[20],vis3[10];
int main() {bool flag=0;int length1,length2;string broken,input;getline(cin,broken);getline(cin,input);length1=broken.length();length2=input.length();for(int i=0; i<length1; i++) {if(broken[i]>='a'&&broken[i]<='z') {vis[broken[i]-'a']=1;} else if(broken[i]>='A'&&broken[i]<='Z') {vis[broken[i]-'A']=1;} else if(broken[i]>='0'&&broken[i]<='9') {vis2[broken[i]-'0']=1;} else if(broken[i]=='_') vis3[0]=1;else if(broken[i]==',') vis3[1]=1;else if(broken[i]=='.') vis3[2]=1;else if(broken[i]=='-') vis3[3]=1;else if(broken[i]=='+') vis3[4]=1;}for(int i=0; i<length2; i++) {if(input[i]>='0'&&input[i]<='9') {if(!vis2[input[i]-'0']) printf("%c",input[i]);} else if(input[i]>='a'&&input[i]<='z') {if(vis[input[i]-'a']) continue;printf("%c",input[i]);} else if(input[i]>='A'&&input[i]<='Z') {if(vis[input[i]-'A']) continue;if(!vis3[4]) printf("%c",input[i]);} else if(input[i]=='_') {if(!vis3[0]) printf("_");} else if(input[i]==',') {if(!vis3[1]) printf(",");} else if(input[i]=='.') {if(!vis3[2]) printf(".");} else if(input[i]=='-') {if(!vis3[3]) printf("-");} else if(input[i]=='+'){if(!vis[4]) printf("+");}}return 0;
}