%%%PBS
#include<bits/stdc++.h>
using namespace std;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline void Read(int& x){
char c=nc();
for(;c<'0'||c>'9';c=nc());
for(x=0;c>='0'&&c<='9';x=(x<<3)+(x<<1)+c-48,c=nc());
}
inline char Getchar(){
char c=nc();
while(c!='?'&&c!='+')c=nc();
return c;
}
inline void Read(string& s){
s.clear();
char c=nc();
while(c=='0'||c=='1'){
s+=c;
c=nc();
}
}
typedef long long ll;
const int N=5000010;
const int sq=320;
int k,n,m,p;
int nx[N][2],f[N],g[N];
int sz;
bool b[N];
int Rt[N],cnt,ncnt;
int Ans,Res;
string s,S;
char c;
int T,num;
int q[N];
int Merge(int x,int y){
if(!x||!y)return x+y;
nx[x][0]=Merge(nx[x][0],nx[y][0]);
nx[x][1]=Merge(nx[x][1],nx[y][1]);
b[x]|=b[y];
return x;
}
inline string Shift(string s){
string S;
int k=Ans%s.size();
for(int i=0;i<s.size();i++)
S+=s[(i+k)%s.size()];
return S;
}
inline int new_node(){
int x=++num;
nx[x][0]=nx[x][1]=g[x]=f[x]=b[x]=0;
return x;
}
inline void Insert(int& x,string y){
if(!x)x=new_node();
int cur=x;
for(int i=0;i<y.size();i++){
bool d=y[i]-'0';
if(!nx[cur][d])nx[cur][d]=new_node();
cur=nx[cur][d];
}
b[cur]=1;
}
inline void Build(int rt){
int l=0,r=0;
f[rt]=0;q[r=1]=rt;
while(++l<=r){
int x=q[l];
for(int i=0;i<2;i++){
int v=nx[x][i];
if(!v)continue;
q[++r]=v;g[v]=b[v];
if(x==rt)f[v]=0;else{
int j=f[x];
while(j&&!nx[j][i])j=f[j];
if(!j)j=rt;
f[v]=nx[j][i];
g[v]+=g[f[v]];
}
}
}
}
inline int Query(int rt){
if(!rt)return 0;
int Ans=0;int x=rt;
for(int i=0;i<S.size();i++){
while(x&&!nx[x][S[i]-'0'])x=f[x];
if(!x)x=rt;
if(nx[x][S[i]-'0'])x=nx[x][S[i]-'0'];
Ans+=g[x];
}
return Ans;
}
void Check(int x){
if(!x)return;
printf("%d %d %d %d %d\n",x,g[x],f[x],nx[x][0],nx[x][1]);
for(int i=0;i<2;i++)Check(nx[x][i]);
}
inline bool Get(int x){
int cur=Rt[x];
for(int i=0;i<s.size();i++){
cur=nx[cur][s[i]-'0'];
if(!cur)return 0;
}
return b[cur];
}
int main(){
Read(T);
for(int j=1;j<=T;j++){
printf("Case #%d:\n",j);
Read(n);
Ans=0;
Rt[1]=Rt[2]=num=sz=0;
while(n--){
if(Getchar()=='+'){
Read(s);
s=Shift(s);
if(Get(1)||Get(2))continue;
sz+=s.size();
Insert(Rt[2],s);
if(sz>sq){
Rt[1]=Merge(Rt[1],Rt[2]);
Rt[2]=0;Build(Rt[1]);sz=0;
}else Build(Rt[2]);
}else{
Read(S);
S=Shift(S);
Ans=0;
for(int i=1;i<=2;i++)Ans+=Query(Rt[i]);
printf("%d\n",Ans);
}
}
}
return 0;
}