418 字
2 分钟
CF600

A. Extract Numbers#

字符串模拟。

我的做法是先记录分割的位置,将字符串分割,之后再判断分割出来的字符串属于哪一类,最后输出。唉字符串。。。

#include<bits/stdc++.h>
#define endl "\n"
#define int long long
using namespace std;
signed main(){
std::ios::sync_with_stdio(false);std::cin.tie(0);
string s;cin>>s;
vector<int> dif;
vector<string> vec;
for(int i=0;i<s.size();i++) if(s[i]==';'||s[i]==',')dif.push_back(i);
for(int i=0;i<dif.size();i++){
if(i==0){
if(dif[i]==0||dif[i]==s.size()-1)vec.push_back("");
else vec.push_back(s.substr(0,dif[i]));
continue;
}
if(dif[i]==dif[i-1]) vec.push_back("");
else vec.push_back(s.substr(dif[i-1]+1,dif[i]-dif[i-1]-1));
}
if(dif.size()!=0){
if(dif[dif.size()-1]==s.size()-1)vec.push_back("");
else vec.push_back(s.substr(dif[dif.size()-1]+1,s.size()-dif[dif.size()-1]));
}
if(dif.size()==0)vec.push_back(s);
vector<string> a,b;
for(auto it:vec){
if(it.size()==0)b.push_back(it);
else if(it[0]=='0'&&it.size()!=1)b.push_back(it);
else{
int flag=0;
for(int i=0;i<it.size();i++){
if(it[i]<'0'||it[i]>'9'){
b.push_back(it);
flag=1;
break;
}
}
if(flag==0)a.push_back(it);
}
}
if(a.size()==0)cout<<"-\n";
else{
cout<<"\"";
for(int i=0;i<a.size();i++){
if(i==a.size()-1)cout<<a[i]<<"\"\n";
else cout<<a[i]<<',';
}
}
if(b.size()==0)cout<<"-\n";
else{
cout<<"\"";
for(int i=0;i<b.size();i++){
if(i==b.size()-1)cout<<b[i]<<"\"\n";
else cout<<b[i]<<',';
}
}
return 0;
}

B. Queries about less or equal elements#

二分查找?不太理解为什么是 B。

signed main(){
int n,m;cin>>n>>m;
vector<int> a(n),b(m);
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<m;i++)cin>>b[i];
sort(a.begin(),a.end());
for(int i=0;i<m;i++){
cout<<upper_bound(a.begin(),a.end(),b[i])-a.begin()<<' ';
}
return 0;
}

C.Make Palindrome#

将给定字符串用最少次数更改为回文串,若次数相同则取字典序较小的回文串。

每次操作为修改字符串中的一个字母。允许重新排列,重新排列不计入操作次数。

既然允许重新排列,那就只跟字母的个数有关,有偶数个的字母不用管,只需要不同的奇数个的字母相互转换即可。要字典序最小,则把较大的字母转换为较小的字母。

最后按照字典序将字母排列到两侧,若有剩余的,即个数为奇数,即为中心字母。

signed main(){
string s;cin>>s;
int n=s.size();
int flag=1;
for(int i=0;i<n/2;i++){
if(s[i]!=s[n-1-i]){
flag=0;
break;
}
}
sort(s.begin(),s.end());
vector<int> cnt(26);
for(int i=0;i<n;i++)cnt[s[i]-'a']++;
vector<char> odds;
for(int i=0;i<26;i++){
if(cnt[i]%2)odds.push_back(i+'a');
}
while(odds.size()>1){
cnt[*(odds.begin())-'a']++;
cnt[*(odds.end()-1)-'a']--;
odds.erase(odds.begin());
odds.erase(odds.end()-1);
}
stringstream ss;
for(int i=0;i<26;i++){
while(cnt[i]>=2){
ss<<char(i+'a');
cnt[i]-=2;
}
}
string ans;ss>>ans;
string rev(ans);
reverse(rev.begin(),rev.end());
for(int i=0;i<26;i++){
if(cnt[i])ans+=(i+'a');
}
ans+=rev;
cout<<ans<<endl;
return 0;
}
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

CF600
https://leaf146.cn/posts/cf600
作者
LeAf146
发布于
2026-07-06
许可协议
MIT

部分信息可能已经过时