const int MAXN=2505,MAXL=1005,Mod=1e9+7;
map<pair<LL,LL>,int> dp[MAXN];
LL len[MAXN];
struct{
int type,x1;
LL x2,x3;
}opt[MAXN];
char s[MAXL];
int ps[MAXL];
int dfs(int n,LL L,LL R){
if(dp[n].find(make_pair(L,R))!=dp[n].end())return dp[n][make_pair(L,R)];
if(n==0)
return ps[R+1]-ps[L];
if(opt[n].type==0)
return dp[n][make_pair(L,R)]=dfs(opt[n].x1,opt[n].x2+L,opt[n].x2+R);
else{
if(L>=len[opt[n].x1])
return dp[n][make_pair(L,R)]=dfs(opt[n].x2,L-len[opt[n].x1],R-len[opt[n].x1]);
else if(R<len[opt[n].x1])
return dp[n][make_pair(L,R)]=dfs(opt[n].x1,L,R);
else
return dp[n][make_pair(L,R)]=(dfs(opt[n].x1,L,len[opt[n].x1]-1)+dfs(opt[n].x2,0,R-len[opt[n].x1]))%Mod;
}
}
char cmd[10];
int main()
{
int n=read_int();
scanf("%s",s+1);
len[0]=strlen(s+1);
_rep(i,1,len[0])ps[i]=ps[i-1]+s[i];
_for(i,1,n){
scanf("%s",cmd);
if(cmd[0]=='S'){
opt[i].type=0;
opt[i].x1=read_int(),opt[i].x2=read_LL(),opt[i].x3=read_LL()-1;
len[i]=opt[i].x3-opt[i].x2+1;
}
else{
opt[i].type=1;
opt[i].x1=read_int(),opt[i].x2=read_int();
len[i]=len[opt[i].x1]+len[opt[i].x2];
}
}
enter(dfs(n-1,0,len[n-1]-1));
return 0;
}