Codeforces Round #767 (Div. 2)

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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值