#include <cmath>
#include <iostream>
#include <math.h>
using namespace std;
/*
最笨的办法暴力求解QvQ
[]内单独做循环比较,[]外直接比较
*/
//不区分大小写的字符比较
bool IsEqual(char x, char y){
if(x == y || fabs(x-y) == 32) return true;
else
return false;
}
//2个指针逐个遍历,no是主函数直接把行号传过来,我觉得比较方便
void Match(string text, string pattern, int no){
int n = text.size();
int m = pattern.size();
int i=0, j=0, k, flag=0, match=0; //flag指示即将进入[],match指示[]内是否匹配到字符
string res = ""; //res记录当前已匹配上的子串,方便输出
while (i<n) {
k=i;
//从text[k] & pattern[j]开始匹配
while (j<m && k<n) {
if(pattern[j] == '['){ //准备进入[]
flag = 1;
++j;
continue;
}
if(flag){
int l = j; // 进入[],l记录pattern的起始位置,向后遍历
while (pattern[l] != ']') {
if(IsEqual(text[k], pattern[l])){ //若匹配上则记录下来
res += text[k];
match = 1;
}
++l;
}
flag = 0; //退出[]比较
if(match){
j=l; //成功匹配,比较下一字符
++j;
++k;
match=0;
}
else{
res=""; //匹配失败,退出本次循环,从主串下一位重新比较
break;
}
}
else{ //[]外的比较,正常比较即可
if (IsEqual(text[k], pattern[j])) {
res += text[k];
++k;
++j;
}
else {
res = "";
break;
}
}
}
if(j == m){ //模式串匹配成功则输出
cout<<no<<" "<<res<<endl;
res = "";
}
j=0;
++i;
}
}
int main() {
int n;
cin>>n;
string text[n], pattern;
for(int i=0; i<n; ++i)
cin>>text[i];
cin>>pattern;
int i, j;
for(i=0; i<n; ++i){
Match(text[i], pattern, i+1);
}
}