import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
static int p1, p2, p3;
public static void main(String[] args) {
Line line;
{
Scanner scanner = new Scanner(System.in);
p1 = scanner.nextInt();
p2 = scanner.nextInt();
p3 = scanner.nextInt();
scanner.nextLine();
line = new Line(scanner.nextLine().toCharArray());
}
line.next();
while (line.nextRow() && !line.onEnd()) {
line.insert(getMidChars(line.get(HorizonDirection.left), line.get(HorizonDirection.right)));
}
System.out.println(line);
}
static Character[] getMidChars(char left, char right) {
if (right <= left || (Character.isDigit(left) && !Character.isDigit(right)) || (Character.isAlphabetic(left) && !Character.isAlphabetic(right)))
return new Character[]{'-'};
Character[] result = new Character[(right - left - 1) * p2];
for (char from = (char) (left + 1), to = (char) (right - 1), i = 0; from <= to; from++)
for (int count = 0; count < p2; count++)
result[i++] = switch (p1) {
case 1 -> Character.toLowerCase(from);
case 2 -> Character.toUpperCase(from);
case 3 -> '*';
default -> throw new IllegalStateException("Unexpected value: " + p1);
};
if (p3 == 2) result = new ArrayList<>(List.of(result)).reversed().toArray(new Character[0]);
return result;
}
}
class Line {
ArrayList<Character> data = new ArrayList<>();
int point = 0;
Line(char[] chars) {
for (char c : chars)
data.add(c);
}
void insert(Character[] chars) {
ArrayList<Character> newData = new ArrayList<>();
Character[] left = data.subList(0, point).toArray(new Character[0]), right = data.subList(point + 1, data.size()).toArray(new Character[0]);
newData.addAll(List.of(left));
newData.addAll(List.of(chars));
newData.addAll(List.of(right));
point += chars.length;
data = newData;
}
char get(HorizonDirection direction) {
return switch (direction) {
case left -> data.get(point - 1);
case right -> data.get(point + 1);
};
}
boolean nextRow() {
while (get() != '-') {
if (!next()) return false;
}
return true;
}
boolean next() {
if (onEnd()) return false;
point++;
return true;
}
boolean onStart() {
return point == 0;
}
boolean onEnd() {
return point == data.size() - 1;
}
char get() {
return data.get(point);
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
for (char d : data)
builder.append(d);
return builder.toString();
}
}
enum HorizonDirection {
left, right
}