这道题很坑的一点就是,有可能坏掉的键盘是空串(所有的键都是好的),如下测试用例
input
NULL
abcdefg
output
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;
}