Codeforces Round #767 (Div. 2)
(solve AB 至此一周六场div.2 赛时一道C题也没有做出来 QAQ!!!)
比赛链接: https://codeforces.com/contest/1629
C题
题目大意
给出一个数组,将数组任意分段,各段的MEX组成一个新串,问字典序最大的新串
题解
统计各数出现的次数存放在cnt数组,可以从cnt数组确定当前的最大mex,然后将原数组指针移动到满足此mex的位置,重复直到原数组指针移出
#include <bits/stdc++.h>
//#define int long long
using namespace std;
void solve();
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
// freopen("in.txt","r",stdin);
int t;cin>>t;
while(t--)solve();
#define _ 0
return ~~(0^_^0);
}
void solve(){
int n;cin>>n;
vector<int> a(n);
vector<int> cnt(n+1);
for(int i=0;i<n;i++){
cin>>a[i];
cnt[a[i]]++;
}
vector<int> res;
int i=0;
while(i<n){
int mex=0;
while(cnt[mex]){
mex++;
}
vector<int> tmp(mex);
int _mex=0;
while(i<n){
if(a[i]<mex && !tmp[a[i]]){
tmp[a[i]]++;
_mex++;
}
cnt[a[i]]--;
i++;
if(_mex==mex)break;
}
res.push_back(mex);
}
for(;i<n;i++)res.push_back(0);
cout<<res.size()<<'\n';
for(int i:res)cout<<i<<' ';cout<<'\n';
}
D题
题目大意
给出长度为n的字符串数组(各字符串长度<=3),问是否有子序列构成回文串
题解
可以先判断各字符串本身是否回文串 和 是否存在完全和自己相反的串
剩下的情况就只有长度为 2+3 和 3+2的串
2+3 可以将2后面拼上所有字符放入set
3+2可以将2前面拼上所有字符进行判断
(做题时犯了一个错误是将长度为3的串的前两个字符组成的字串放入了set,这样会导致本来是"abX" "Xba"形式的两个串匹配成回文串 具体地,它们可能是 abc dbc,但是被判断成了回文串)
#include <bits/stdc++.h>
//#define int long long
using namespace std;
void solve();
string _reverse(string s);
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
// freopen("in.txt","r",stdin);
int t;cin>>t;
while(t--)solve();
#define _ 0
return ~~(0^_^0);
}
void solve(){
int n;cin>>n;
vector<string> a(n);
for(int i=0;i<n;i++)cin>>a[i];
set<string> st;
int yes=0;
for(int i=0;i<n;i++){
string s=a[i];
string t=_reverse(s);
if(s==t || st.count(t))yes=1;//自己是回文或者前面存在完全相反的
int len=s.size();
if(len!=1){
st.insert(s);
if(len==2){
for(char c='a';c<='z';c++){
if(st.count(_reverse(c+s)))yes=1;;
}
for(char c='a';c<='z';c++){
st.insert(s+c);
}
}
}
}
if(yes)cout<<"YES\n";
else cout<<"NO\n";
}
string _reverse(string s){
string tmp=s;
reverse(tmp.begin(),tmp.end());
return tmp;
}