题目来源【牛客竞赛】:

https://ac.nowcoder.com/acm/problem/16644

题解:

#include<bits/stdc++.h>
using namespace std;

//引入下面有用到的函数
bool isok(char a,char b);
string func(const string& p,int p1,int p2,int p3);

//喜欢简短主函数,给人清爽的感觉
int main(){
int a,b,c;cin>>a>>b>>c;
string s;
//清楚缓冲区之后再进行读取一整行字符串,也可以把该行直接改成cin>>string
cin.ignore();getline(cin,s);
//func是一个主要功能实现的函数,把所有参数往里面塞
string ans=func(s,a,b,c);
cout<<ans;
return 0;
}
//这是一个判断前后两数是否同为字母或同为数字的函数
bool isok(char a,char b){
if(isdigit(a)&&isdigit(b)){
return 1;
}
else if(isalpha(a)&&isalpha(b)){
return 1;
}
return 0;
}


string func(const string& p,int p1,int p2,int p3){
//r作为临时存储单个填充串
string r="";
//p引用了字符串,不要直接用带const的p,因此创建一个ans作为return的答案
string ans=p;
//遍历原字符串
for(int i=0;i<ans.length();i++){
//如果当前字符是'-'且前后类型相同,且后者比前者大
if(ans[i]=='-'&&isok(ans[i-1],ans[i+1])&&ans[i-1]<ans[i+1]){
//x临时存储原字符串中'-'左边字符
char x=ans[i-1];
//初始化r(r包括'-'左右的元素)
r=r+x;x++;
//如果当前元素不是'-'右边元素,进行操作
while(x!=ans[i+1]){
//变量k临时存储p2,作用还有用于while()的计数
int k=p2;
//三种情况不同处理,其中注意toupper()返回int值所以要转化为char
if(p1==1){while(k--) r=r+x;x++;}
if(p1==2){while(k--) r=r+char(toupper(x));x++;}
if(p1==3){while(k--) r=r+'*';x++;}
}
//翻转函数,注意下标
if(p3==2){reverse(r.begin()+1,r.end());}
//将ans的'x-x'用r取代,
//遍历变量i向前退一格,来到r的头部,以防出界,
//并且清空临时存储r,
ans.replace(i-1,2,r); i--;r="";
}
}
return ans;
}

欢迎提问和交流