Educational Codeforces Round 2(远古edu计划)

文章介绍了如何使用C++实现字符串模拟操作,如二分查找法解决特定问题,以及利用贪心策略处理回文串中奇数字符的替换。作者展示了如何使用栈来模拟字符串的构建过程。

A.

恶心模拟。。

模拟一下分类即可

数字类,数字0,或者都是数字

字母类,字母空的也是字母,有字母就是字母

#include<bits/stdc++.h>
#define INF 1e9
using namespace std;
typedef long long ll;
const int N=2e5+9;
string number[N],capital[N];
int number_pos,capital_pos;
void lan(){
   string s;
   cin>>s;
   s+=";";
   string s1="";
   for(int i=0;i<s.size();){
        s1="";
        while(i<s.size() && s[i]!=',' && s[i]!=';'){//读取完整
            s1+=s[i];
            i++;
        }
        if(s1==""){//字母
            capital[++capital_pos]=s1;
            i++;
            continue;
        }
        if(s1=="0"){//数字
            number[++number_pos]=s1;
        }else if(s1[0]=='0'){//01
            capital[++capital_pos]=s1;
        }else{//全是数字才是数字,其他都是字母
            bool flag=true;
            for(int j=0;j<s1.size();j++){
                if(s1[j]<'0' || s1[j]>'9'){
                    flag=false;
                    break;
                }
            }
            if(flag){
                number[++number_pos]=s1;
            }else{
                capital[++capital_pos]=s1;
            }
        }
        i++;
   }
   if(!number_pos){//没有就-
        cout<<"-";
   }else{//输出前n-1一个
        cout<<"\"";
        for(int i=1;i<number_pos;i++){
            cout<<number[i]<<",";
        }
        cout<<number[number_pos]<<"\"";//最后一个特别处理
   }
   cout<<'\n';
   if(!capital_pos){
        cout<<"-";
   }else{
        cout<<"\"";
        for(int i=1;i<capital_pos;i++){
            cout<<capital[i]<<",";
        }
        cout<<capital[capital_pos]<<"\"";
   }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int q=1;
    while(q--){
        lan();
    }
    return 0;
}

B.

二分upper_bound就好了

#include<bits/stdc++.h>
#define INF 1e9
using namespace std;
typedef long long ll;
const int N=2e5+9;
int a[N],b[N];
int n,m;
int work(int x){
    return upper_bound(a+1,a+1+n,x)-a-1;
}
void lan(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=m;i++){
        cin>>b[i];
    }
    sort(a+1,a+1+n);
    for(int i=1;i<=m;i++){
        cout<<work(b[i])<<" ";
    }

}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int q=1;
    while(q--){
        lan();
    }
    return 0;
}

C.

贪心,大的且只有奇数数量就变成小的,回文串对称特性所以用栈模拟后半段即可

#include<bits/stdc++.h>
#define INF 1e9
using namespace std;
typedef long long ll;
const int N=2e5+9;
int c[N];
void lan(){
    string s;
    cin>>s;
    int n=s.length();
    for(int i=0;i<n;i++){//桶存
        c[s[i]-'a']++;
    }
    for(int i=25;i>=0;i--){//倒着找,找到的肯定是最大的
        if(c[i]&1){
            for(int j=0;j<26;j++){
                if(c[j]&1){//正着找,找到的肯定是最小的,但是也有可能找不到  aba
                    c[j]++;
                    c[i]--;
                    break;
                }
            }
        }
    }
    int flag=-1;//记录中间字母
    for(int i=0;i<26;i++){
        if(c[i]&1){
            flag=i;
        }
    }
    stack<char> stk;//栈模拟后面
    for(int i=0;i<26;i++){//找最小必然字典序最小
        for(int j=1;j<=c[i]/2;j++){
            cout<<char(i+'a');
            stk.push(char(i+'a'));
        }
    }
    //aabb
    if(flag!=-1){
        cout<<char(flag+'a');//输出中间
    }
    //倒着输出即可
    while(!stk.empty()){
        cout<<stk.top();
        stk.pop();
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int q=1;
    while(q--){
        lan();
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值