#include <bits/stdc++.h>
using namespace std;
size_t len,n;
string str;
vector<string>var[40010];
map<string,vector<int> >fun;
map<string,string>mp;
vector<string> work(string str)
{
	vector<string>ans;str.push_back(',');
	for (size_t i=0;i<str.size();i=str.find(",",i)+1)
		ans.push_back(str.substr(i,str.find(",",i)-i));
	return ans;
}
pair<string,vector<string> > get(size_t pos)
{
	size_t lpos=str.find("(",pos),rpos=str.find(")",pos);
	return make_pair(str.substr(pos,lpos-pos),work(str.substr(lpos+1,rpos-lpos-1)));
}
bool check(string a,string b)
{
	if (b[0]!='_') return a==b;
	if (b.size()==1) return true;
	if (mp.count(b)) return a==mp[b];
	mp[b]=a;
	return true;
}
bool match(vector<string> a,vector<string> b)
{
	mp.clear();
	int n=a.size(),m=b.size();
	if (n!=m) return false;
	for (int i=0;i<n;i++)
		if (!check(a[i],b[i]))
			return false;
	return true;
}
int solve(pair< string,vector<string> >f)
{
	if (!fun.count(f.first)) return 0;
	int ans=0;
	for (auto i:fun[f.first])
		ans+=match(var[i],f.second);
	return ans;
}
int main()
{
	while (getline(cin,str) && str.size()!=0)
	{
		str.erase(remove(str.begin(),str.end(), ' '), str.end());
		for (size_t pos=0;pos<str.size();pos=str.find(")",pos)+1)
		{
			auto res=get(pos);
			if (!fun.count(res.first))
				fun[res.first]=vector<int>();
			fun[res.first].push_back(++n);
			var[n]=res.second;
		}
	}
	while (getline(cin,str) && str.size()!=0)
	{
		str.erase(remove(str.begin(),str.end(), ' '), str.end());
		printf("%d\n",solve(get(0)));
	}
}

