/*思路:遍历字符串match[i],与s逐个比较
分为两种:普通字符 和 通配字符(中括号内的)
分为两种:普通字符 和 通配字符(中括号内的)
而具体字符判断的过程:根据是否为大小写,各有不同判断条件
考虑单独构造一个字符比较函数compare
这样无论是否是在中括号里面,判断的过程均相同
*/
#include<iostream>
#include<string>using namespace std;
string match[1000];
string s;
bool compare(char c1,char c2){//比较两个字符:只要不满足就结束
if(c1>='a'&&c1<='z'){
if(c1!=c2&&c1-32!=c2){
return false;
}
}
else if(c1>='A'&&c1<='Z'){
if(c1!=c2&c1+32!=c2){
return false;
}
}
else{
if(c1!=c2){
return false;
}
}
return true;//满足条件 返回true
}
bool judge(string k){//匹配函数
int i=0,j=0;
int flag=1;//字符串匹配标志
while(i<k.size()&&j<s.size()){
if(s[j]!='['){//普通字符
if(!compare(s[j],k[i])){
flag=0;
break;
}
}
else {//通配字符
int flag2=0;//通配符匹配标志
for(int p=j+1;s[p]!=']';p++){//遍历中括号里面的字符
if(compare(s[p],k[i])){//只要满足就结束
flag2=1;
break;
}
}
if(flag2==0){
flag=0;
break;
}
}
i++;//每比较完一个字符,i、j同时右移
if(s[j]=='['){
while(s[++j]!=']'); //比较通配字符后,j右移至']'位置
}
j++;
}//while结束
if(j==s.size()&&i==k.size())return flag;//检查长度
else return false;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
cin>>match[i];
}
cin>>s;
for(int i=0;i<n;i++){
if(judge(match[i])){
cout<<i+1<<" "<<match[i]<<endl;
};
}
}
}