// All rights reserved.
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
string str[20];
int t;
string cmd;
string detect();
int num(int p=0);
void print_all(string* str, int t){
for(int i=0;i<t;i++){
cout<<str[i]<<endl;
}
}
bool isNum(string str)
{
stringstream sin(str);
double d;
char c;
if(!(sin >> d)){return false;}
if (sin >> c){return false;}
return true;
}
int num(string p){
return atoi(p.c_str());
}
string detect(){
cin>>cmd;
//cout<<cmd;
if(cmd=="over")
return "";
else if(cmd=="add"){
string a;
string b;
a=detect();
b=detect();
if(isNum(a)&&isNum(b)&&num(a)>=0&&num(a)<=99999&&num(b)>=0&&num(b)<=99999)
return to_string(num(a)+num(b));
else
return a+b;
}
else if(cmd=="copy"){
int xu,pos,len;
xu=num(detect());
pos=num(detect());
len=num(detect());
return str[xu-1].substr(pos,len);
}
else if(cmd=="find"){
string search;
int xu;
search=detect();
xu=num(detect());
if(str[xu-1].find(search,0)!=string::npos)
return to_string(str[xu-1].find(search,0));
else
return to_string((int)search.length());
}
else if(cmd=="rfind"){
string search;
int xu;
search=detect();
xu=num(detect());
if(str[xu-1].rfind(search,str[xu-1].length()-1)!=string::npos) //rfind has a return value of npos
return to_string(str[xu-1].rfind(search,str[xu-1].length()-1));
else
return to_string((int)search.length());
}
else if(cmd=="print"){ //以下是死操作(没有返回值
int xu;
xu=num(detect());
//cout<<xu<<endl;
cout<<str[xu-1]<<endl;
}
else if(cmd=="printall")
print_all(str,t);
else if(cmd=="insert"){
string inserterr;
int xu;
int pos;
inserterr=detect();
xu=num(detect());
pos=num(detect());
str[xu-1].insert(pos,inserterr);
}
else if(cmd=="reset"){
string reseterr;
int xu;
reseterr=detect();
xu=num(detect());
str[xu-1].assign(reseterr);
}
else
return cmd;
return "";
}
int main(int argc, const char * argv[]) {
cin>>t;
string tmp;
for(int i=0;i<t;i++){
cin>>tmp;
str[i].assign(tmp);
}
while(cmd!="over"){
detect();
}
/*for(int i=0;i<t;i++){
cout<<str[i]<<endl;;
}*/
return 0;
}