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;
}
posted @ 2018-09-21 09:10  CF过2100就买ARCTERYX  阅读(253)  评论(0编辑  收藏  举报