Educational Codeforces Round 51 (Rated for Div. 2) A. Vasya And Password
我想的算法很容易想到,但是实现有点繁琐(可能也是我太菜了,想不到更高效的实现方法)。
算法是这样的:按照题意的限制,密码中可能缺失的数据类型只有两种情况:缺失一种类型和缺失两种类型。
对缺失一种类型的情况,只需要找到缺失的类型,找到字符串中已有的类型中最多的那种,然后用一个没有的类型代替最多的类型的一个字符即可。我用一个整型数组存出现次数,下标0表示大写字母,1表示小写字母,2表示数字。我的bug就出在这里,在寻找已有类型中字符数最多的那个类型时,觉得才比较3个元素,太少了,if else就行了,结果少写了一个else,就错了。最稳妥的办法是,多于两个元素,就用for循环,更新最大值和下标
对缺失两种类型的情况,更简单了,由于题目已保证字符串长度大于3,所以只需要把前两个字符设成没有的那两个类型就行了。
下面上代码,我写的又臭又长
#include <bits/stdc++.h>
using namespace std;
string s;
bool jud(string s) {
int ll=0,ul=0,nu=0;
for (int i=0;i<(int)s.size();i++) {
if (s[i]>='a'&&s[i]<='z') ll=1;
else if (s[i]>='A'&&s[i]<='Z') ul=1;
else if (s[i]>='0'&&s[i]<='9') nu=1;
}
if (ll&&ul&&nu) return true;
else return false;
}
char ex(int n) {
if (n==0) return 'A';
else if (n==1) return 'a';
else return '1';
}
void solve(string s) {
int spot[4]={0,0,0,0},sum=0;
for (int i=0;i<(int)s.size();i++) {
if (s[i]>='A'&&s[i]<='Z') spot[0]++;
else if (s[i]>='a'&&s[i]<='z') spot[1]++;
else if (s[i]>='0'&&s[i]<='9') spot[2]++;
}
for (int i=0;i<3;i++) sum+=spot[i]?1:0;
// for (int i=0;i<3;i++) cout<<spot[i]<<' ';
// cout<<endl;
if (sum==2) {
int mxi=0,mii=0;
if (spot[0]>spot[1]) {
if (spot[0]>spot[2]) mxi=0;
else mxi=2; //第一次写时这句话没有,就WA了
}
else {
if (spot[1]>spot[2]) mxi=1;
else mxi=2;
}
for (int i=0;i<3;i++) if (spot[i]==0) mii=i;
//cout<<mxi<<' '<<mii<<endl;
if (mxi==0) {
for (int i=0;i<(int)s.size();i++) {
if (s[i]>='A'&&s[i]<='Z') {
s[i]=ex(mii);
break;
}
}
}
else if (mxi==1) {
for (int i=0;i<(int)s.size();i++) {
if (s[i]>='a'&&s[i]<='z') {
s[i]=ex(mii);
break;
}
}
}
else {
for (int i=0;i<(int)s.size();i++) {
if (s[i]>='0'&&s[i]<='9') {
s[i]=ex(mii);
break;
}
}
}
cout<<s<<endl;
}
else if (sum==1) {
if (!spot[0]&&!spot[1]) {
s[0]='A',s[1]='a';
cout<<s<<endl;
}
else if (!spot[0]&&!spot[2]) {
s[0]='A',s[1]='1';
cout<<s<<endl;
}
else {
s[0]='a',s[1]='1';
cout<<s<<endl;
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin>>n;
for (int i=0;i<n;i++) {
cin>>s;
if (jud(s)) cout<<s<<endl;
else solve(s);
}
return 0;
}