#include<bits/stdc++.h>
#define FILE "read"
#define MAXN 1000010
using namespace std;
struct node{int y,next;}e[MAXN<<1];
int n,m,ans,cnt,dfs_clock,len,pos[MAXN],vis[MAXN],fail[MAXN],Link[MAXN],q[MAXN],L[MAXN],R[MAXN],c[MAXN<<1],tr[MAXN][27];
char ch[MAXN];
inline int read(){
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
void insert(int x,int y){e[++len].next=Link[x];Link[x]=len;e[len].y=y;}
void add(int x,int v){while(x<=dfs_clock)c[x]+=v,x+=(x&-x);}
int get(int x){int temp(0);while(x)temp+=c[x],x-=(x&-x);return temp;}
void dfs(int x){
L[x]=++dfs_clock;
for(int i=Link[x];i;i=e[i].next)
dfs(e[i].y);
R[x]=++dfs_clock;
}
void extend(int &now){
scanf("%s",ch+1); int N=strlen(ch+1);
for(int i=1;i<=N;++i){
if(!tr[now][ch[i]-'a']) tr[now][ch[i]-'a']=++cnt;
now=tr[now][ch[i]-'a'];
}
}
void build(){
int head=0,tail=0;
for(int i=0;i<26;++i) if(tr[0][i]) q[++tail]=tr[0][i];
while(++head<=tail){
int x=q[head];
for(int i=0;i<26;++i){
if(!tr[x][i]) tr[x][i]=tr[fail[x]][i];
else fail[tr[x][i]]=tr[fail[x]][i],q[++tail]=tr[x][i];
}
}
for(int i=1;i<=cnt;++i) insert(fail[i],i); dfs(0);
}
void work(){
scanf("%s",ch+1); int now=0,N=strlen(ch+1);
for(int i=1;i<=N;++i){
while(now&&!tr[now][ch[i]-'a']) now=fail[now];
now=tr[now][ch[i]-'a']; ans+=get(L[now]);
}
}
void solve(){
n=read(); m=read();
for(int i=1;i<=m;++i) extend(pos[i]); build();
for(int i=1;i<=m;++i) vis[i]=1;
for(int i=1;i<=m;++i) add(L[pos[i]],1),add(R[pos[i]],-1);
for(int i=1;i<=n;++i){
char opt; scanf("\n%c",&opt);
if(opt=='?') ans=0,work(),printf("%d\n",ans);
else if(opt=='-'){
int x=read();if(!vis[x])continue;
add(L[pos[x]],-1);add(R[pos[x]],1);vis[x]=0;
}
else{
int x=read();if(vis[x]) continue;
add(L[pos[x]],1);add(R[pos[x]],-1);vis[x]=1;
}
}
}
int main(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
solve();
return 0;
}