#include <fstream>
#include <map>
#include <vector>
using namespace std;
ifstream cin("trie.in");
ofstream cout("trie.out");
struct adat
{
map<char,int>m;
int dbszo,eddig;
};
vector<adat>x;
int a;
string s;
int betesz()
{
int i,p=0;
int poz=0;
for(i=0;i<s.length();i++)
{
poz=x[p].m[s[i]];
if(poz==0)
{
x.push_back({});
x[p].m[s[i]]=x.size()-1;
poz=x.size()-1;
}
x[poz].eddig++;
p=poz;
}
x[p].dbszo++;
}
int kivesz()
{
int i,p=0;
int poz=0;
for(i=0;i<s.length();i++)
{
poz=x[p].m[s[i]];
x[poz].eddig--;
p=poz;
}
x[p].dbszo--;
}
int hanyszor()
{
int i,p=0;
int poz=0;
for(i=0;i<s.length();i++)
{
poz=x[p].m[s[i]];
if(x[poz].eddig) p=poz;
else break;
}
cout<< x[p].dbszo <<"\n";
}
int prefix()
{
int i,p=0;
int poz=0;
for(i=0;i<s.length();i++)
{
poz=x[p].m[s[i]];
if(x[poz].eddig) p=poz;
else break;
}
// if(p==poz) dbp--;
if(i>=s.length())
i--;
cout<<i<<"\n";
}
int main()
{
ios::sync_with_stdio(false);
x.resize(1);
while(cin>>a)
{
cin>>s;
s.push_back(' ');
if(a==0) betesz();
else if(a==1) kivesz();
else if(a==2) hanyszor();
else prefix();
}
return 0;
}