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