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

被折叠的 条评论
为什么被折叠?



