超级大摸你,决定从头遍历到尾,遇到合法的'-'进入solve处理,注意'-'在开头和结尾都不合法,两边类型不同也不合法,然后对合法情况下的特殊情况进行处理即可。
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define endl '\n'
using namespace std;
using ll=long long;
using ull=unsigned long long;
using PII=pair<int,int>;
using PIS=pair<int,string>;
const int N=2e5+10;
ull p1,p2,p3;
string s;
vector<char>ans;
bool check(ull x){
if(x==s.size()-1)return 0;
if(x==0)return 0;
else if(s[x+1]>='a'&&s[x+1]<='z'&&ans.back()>='a'&&ans.back()<='z')
return 1;
else if(s[x+1]>='0'&&s[x+1]<='9'&&ans.back()>='0'&&ans.back()<='9')
return 1;
return 0;
}
void solve(ull k){
if(p3==1){
if(p1==1){
char goal=ans.back();
for(char x=goal+1;x<s[k+1];x++){
rep(i,1,p2){
ans.push_back(x);
}
}
}
else if(p1==2){
char goal=ans.back();
if(s[k+1]>='a'&&s[k+1]<='z'){
for(char x=goal-31;x<s[k+1]-32;x++){
rep(i,1,p2){
ans.push_back(x);
}
}
}
else{
char goal=ans.back();
for(char x=goal+1;x<s[k+1];x++){
rep(i,1,p2){
ans.push_back(x);
}
}
}
}
else if(p1==3){
int cnt=(s[k+1]-ans.back()-1)*p2;
rep(i,1,cnt)ans.push_back('*');
}
}
else if(p3==2){
if(p1==1){
char goal=ans.back();
for(char x=s[k+1]-1;x>goal;x--){
rep(i,1,p2){
ans.push_back(x);
}
}
}
else if(p1==2){
if(s[k+1]>='a'&&s[k+1]<='z'){
char goal=ans.back();
for(char x=s[k+1]-33;x>goal-32;x--){
rep(i,1,p2){
ans.push_back(x);
}
}
}
else{
char goal=ans.back();
for(char x=s[k+1]-1;x>goal;x--){
rep(i,1,p2){
ans.push_back(x);
}
}
}
}
else if(p1==3){
int cnt=(s[k+1]-ans.back()-1)*p2;
rep(i,1,cnt)ans.push_back('*');
}
}
}
int main(){
ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
cin>>p1>>p2>>p3;
cin>>s;
ull l=0;
while(l<s.size()){
if(s[l]!='-'){
ans.push_back(s[l]);
l++;
continue;
}
else {
if(check(l)){
if(s[l+1]<=ans.back()){
ans.push_back('-');
ans.push_back(s[l+1]);
l+=2;
}
else if(s[l+1]==ans.back()+1){
ans.push_back(s[l+1]);
l+=2;
}
else{
solve(l);
ans.push_back(s[l+1]);
l+=2;
}
}
else{
ans.push_back('-');
l++;
}
}
}
for(char x:ans)cout<<x;
return 0;
}