#include <string.h>
#include <stdio.h>
int main() {
int flag, a, b, n;
char s[100], str[100];
scanf("%d %s", &n, s);
for (int i = 1; i <= n; i++) {
scanf("%d", &flag);
if (flag == 1) {
scanf("%s", str);
strcat(s, str);
printf("%s\n", s);
} else if (flag == 2) {
scanf("%d %d", &a, &b);
strncpy(s, s + a, b);
s[b] = '\0';
printf("%s\n", s);
} else if (flag == 3) {
scanf("%d %s", &a, str);
memmove(s + a + strlen(str), s + a, strlen(s) - a + 1);
/** `s + a + strlen(str)`:这是移动后字符应该存放的起始位置。也就是说,从当前 `s` 的第 `a` 个位置开始,加上 `str` 的长度,这样我们可以确保 `str` 能够被插入到正确的位置。
* `s + a`:这是移动前字符的起始位置,即当前 `s` 的第 `a` 个位置。
* `strlen(s) - a + 1`:这是要移动的字符数量。从位置 `a` 到字符串 `s` 的末尾的所有字符都会被移动。*/
memcpy(s + a, str, strlen(str));
/** `s + a`:这是目标位置的指针,即 `str` 应该被复制到的位置,也就是 `s` 的第 `a` 个位置。
* `str`:这是源位置的指针,即 `str` 中字符的当前位置。
* `strlen(str)`:这是要复制的字符数量,即 `str` 的长度。*/
printf("%s\n", s);
} else if (flag == 4) {
scanf("%s", str);
a = strstr(s, str) - s;
printf("%d\n", a);
}
}
return 0;
}