Acwing 第 66 场周赛 A-C

2A,来晚 + 中间有事,第三题没写,但是写第三题的时候也感觉犯迷糊,读懂题意就好了

A AcWing 4606. 奇偶判断

题意:判断末位是偶数还是奇数

跳过

 

B AcWing 4607. 字母补全

题意:一段包含问号的字符序列,可以将问号改为任何字符,使一段长度为26的区间包括['A','Z']之间的所有字符

挨个遍历,类似滑动窗口,当新的第i 个进入的时候,将i - 26 删除,判断当前段有没有重复的非问号字符,如果没有,说明这一段可以修改

修改方式:把所有的字符存到set,再把已经存在的非问号字符删掉,把每个字符变成set的第一个字符,并删除

//-------------------------代码----------------------------

//#define int ll
const int N = 1e5+10;
int n,m;

    string a;
    
void get(int x) {
    int l = x - 25,r = x;
    set<char> s;
    fo(i,0,25) {
        s.insert('A' + i);
    }
    
    fo(i,l,r) {
        if(s.count(a[i]))
        s.erase(a[i]);
    }
    fo(i,l,r) {
        if(a[i] == '?') {
            a[i] = *s.begin();
            s.erase(s.begin());
        }
    }
}
void solve()
{
    cin>>a;
    map<char,int> mp;
    set<char> q;
    bool ok = 0;
    int dsad  = a.size() - 1;
    for(int i = 0;i<=dsad;i ++ ) {
        mp[a[i]] ++ ;q.insert(a[i]);
        if(i >= 25) {
            if(q.size() == 26 || mp['?'] + q.size() - 1== 26) {
                ok = 1;get(i);
                break;
            }
            else {
                mp[a[i-25]]--;
                if(mp[a[i-25]] == 0) {
                    q.erase(a[i-25]);
                }
            }
        }
    }
    
    if(!ok) {
        None;rt;
    } 
    fo(i,0,dsad) {
        if(a[i] == '?') {
            a[i] = 'A';
        }
    }
    cout<<a<<endl;
}
void main_init() {}
signed main(){
    AC();clapping();TLE;
    cout<<fixed<<setprecision(12);
    main_init();
//  while(cin>>n,n)
//  while(cin>>n>>m,n,m)
//    int t;cin>>t;while(t -- )
    solve();
//    {solve(); }
    return 0;
}

/*样例区


*/

//------------------------------------------------------------

C AcWing 4608. 整数分组

题意:将整数分成两组,每组只出现过一次的数被称为特殊数,问能不能使两组特殊数数量相同,如果相同输出每个数字属于哪一组,(A?B?)

先预处理出所有只出现一次的数字,如果这种数字有偶数个,就一半放在A,剩下的所有数放在B

如果有奇数个,如果剩下的数有数量大于2的,就把这个数放一个在A,剩下的放在B

不然就是“NO”

//-------------------------代码----------------------------

//#define int ll
const int N = 1e5+10;
int n,m;
string s;
void solve()
{
    int n;cin>>n;
    V<int> v(n);
    int cnt = 0;
    map<int,int> mp;
    fo(i,0,n-1) {
        cin>>v[i];
        mp[v[i]] ++ ;
        if(mp[v[i]] == 1) cnt ++ ;
        else if(mp[v[i]] == 2) cnt -- ;
    }
    if(cnt % 2 == 0) {
        int x = cnt / 2;
        fo(i,0,n-1) {
            if(x!= 0 && mp[v[i]] == 1) {
                s += 'A';
                x -- ;
            } else s += 'B';
        }
        cout<<"YES"<<endl;
        cout<<s<<endl;
    } else {
        int num = -1;
        for(auto it:mp) {
            if(it.second > 2) {
                num = it.first;
                break;
            }
        }
        if(num == -1) {
            cout<<"NO"<<endl;
        } else {
            int x = cnt / 2;
            fo(i,0,n-1) {
                if(x!= 0 && mp[v[i]] == 1) {
                    s += 'A';
                    x -- ;
                } else if(num != -1 && num == v[i]) {
                    s += 'A';
                    num = -1;
                } else s += 'B';
            } 
            cout<<"YES"<<endl;
            cout<<s<<endl;
        }
    }
}
void main_init() {}
signed main(){
    AC();clapping();TLE;
    cout<<fixed<<setprecision(12);
    main_init();
//  while(cin>>n,n)
//  while(cin>>n>>m,n,m)
//    int t;cin>>t;while(t -- )
    solve();
//    {solve(); }
    return 0;
}

/*样例区


*/

//------------------------------------------------------------

 

posted @ 2022-08-27 21:44  er007  阅读(24)  评论(0编辑  收藏  举报