简单的模拟,注意不要漏条件。在处理“x-x”类型的时候不用先输出第三位的x,以免与后面的‘-’冲突。还有一个要注意的地方是当p1=2的时候大写处理要先判断是不是字母,如果是数字就不用转换。

#include<bits/stdc++.h>
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);

using namespace std;
void solve()
{
	int p1,p2,p3;
	cin>>p1>>p2>>p3;
	string s;
	cin>>s;
	int l=s.length();
	for(int i=0;i<l;i++)
	{
		if(s[i+1]!='-'||s[i]=='-')cout<<s[i];//直接输出该位
		else if((s[i]<='9'&&s[i+2]>='A')||(s[i+2]<='9'&&s[i]>='A'))//字母-数字情况
		{
			cout<<s[i]<<s[i+1];
			i++;
		}
		else if(s[i]>=s[i+2])//左大右小情况
		{
			cout<<s[i]<<s[i+1];
			i++;
		}
		else if(s[i]==s[i+2]-1)//后继情况
		{
			cout<<s[i];
			i++;
		}
		else
		{
			int n1=s[i],n2=s[i+2];
			cout<<s[i];
			if(p3==1)
			{
				if(p1==1)
				{
					for(int j=n1+1;j<=n2-1;j++)
						for(int k=1;k<=p2;k++)    cout<<char(j);
				}
				else if(p1==2)//注意判断是否为字母
				{
					for(int j=n1+1;j<=n2-1;j++)
						for(int k=1;k<=p2;k++)
						{
							if(j<='9')cout<<char(j);
							else cout<<char(j+'A'-'a');	
						}
				}
				else
				{
					for(int j=n1+1;j<=n2-1;j++)
					   for(int k=1;k<=p2;k++)    cout<<"*";
				}
			}
			else
			{
				if(p1==1)
				{
					for(int j=n2-1;j>=n1+1;j--)
						for(int k=1;k<=p2;k++)
						{
							cout<<char(j);
						}
				}
				else if(p1==2)//这里一定要判断是不是字母 
				{
					for(int j=n2-1;j>=n1+1;j--)
						for(int k=1;k<=p2;k++)
						{
							if(j<='9')cout<<char(j);
							else cout<<char(j+'A'-'a');	
						}
				}
				else
				{
					for(int j=n1+1;j<=n2-1;j++)
                        for(int k=1;k<=p2;k++)    cout<<"*";
				}
			}
			i++;
		}
	}
} 

int main()
{  
	IOS; 
	solve();
	return 0; 
}