#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include <string>
#include<cmath>
#include<sstream>
using namespace std;
int a[4];
int main()
{
for (int i = 1; i <= 3; i++) cin >> a[i];//三个:p1 p2 p3 挨个读入
getchar();//由于下面有getline 所以先吃掉回车
string s;
getline(cin, s);
int pos = s.find("-");//找到第一个减号
while (pos < s.size())//如果s里面还能找到减号(退出的条件为 pos>=s.size() 即pos==string::npos)
{
if (s[pos + 1] > s[pos - 1])//如果减号右边的字符ascii 码大于左边的字符ascii码才动(做变换) 否则不动(不做变换)
{
string tmp = "";
if (s[pos + 1] >= 'a')
{
for (int i = s[pos - 1] + 1; i < s[pos + 1]; i++)
{//这里是默认左右都是字母
for (int j = 1; j <= a[2]; j++)
{
if (a[1] == 1)//1对应填小写字母
{
tmp += (char)i;
}
else if (a[1] == 2)//2对应填大写字母
{
tmp += (char)(i - 32);
}
else//(3)否则的话填*
tmp += '*';
}
}
}
else//else 表示左右两边不是字母 即数字
{
for (int i = s[pos - 1] + 1; i < s[pos + 1]; i++)
{//这里是数字
for (int j = 1; j <= a[2]; j++)
{
if (a[1] != 3)//同以上if 注释就不写了
tmp += (char)(i);
else
tmp += '*';
}
}
}
if (a[3] == 2) reverse(tmp.begin(), tmp.end());//最后处理a[3]==2 表示反转重复加过的字母或数字
s = s.substr(0, pos) + tmp + s.substr(pos + 1, s.size() - 1 - pos);//更新过后的字符串=原字符串截到减号之前+减号左右需要重复的+减号之后的
}
pos = s.find("-", pos + 1);//pos+1 接着下一轮找“-” 这里只用pos+1就行 因为找“-”是从左往右去找的 更新减号左右重复的东西也是在“-”之后更新的 所以pos之前的下标不受影响
}
cout << s << endl;
//cout << "abcsttuuvvw1234556677889s-4zz";
//cout << (s == "abcsttuuvvw1234556677889s-4zz");//测试:这里输出了1啊 明明是对的
//cout << (s == "aCCCBBBd-d");//测试样例2:也对
//cout << (s == "aBBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYz");//洛谷全红了 我就下载了第一个数据点 也对
/*
注:洛谷第一个下载的数据点为:
样例输入:
2 2 1
a-z
样例输出:
aBBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYz
*/
return 0;
}