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; } /*样例区 */ //------------------------------------------------------------