#include <bits/stdc++.h>
using namespace std;
#define in_range(x,y,z) for (int x=y; x<z; x++)
typedef long long ll;
int find_subctr(string t, string s)
{
const int p = 97; // основание системы счисления для хеширования строк
// вычисляем степени числа P, чтобы ускорить процесс хеширования
vector<ll> p_pow (s.length());
p_pow[0] = 1;
for (size_t i=1; i<p_pow.size(); ++i)
p_pow[i] = p_pow[i-1] * p;
// вычисляем хеши всех префиксов строки S
vector<ll> h (s.length());
for (size_t i=0; i<s.length(); ++i)
{
h[i] = (s[i] - 't' + 1) * p_pow[i];
if (i) h[i] += h[i-1];
}
// посчитаем хеш строки Т
ll h_t = 0;
for (size_t i=0; i<t.length(); ++i)
h_t += (t[i] - 't' + 1) * p_pow[i];
// сравниваем хеши строки T и подстрок S длины |T|
for (size_t i = 0; i + t.length() - 1 < s.length(); ++i)
{
ll cur_h = h[i+t.length()-1];
if (i) cur_h -= h[i-1];
// если равенство выполняется хотя бы один раз, мы прекращаем поиск
if (cur_h == h_t * p_pow[i])
return int(i);
}
return -1;
}
int main()
{
vector<string>T,S,C; // наборы строк T и S, а также набор образцов единичной длины C
int n;
cin >> n;
string tmp;
getline(cin,tmp);
in_range(i,0,n)
{
getline(cin,tmp);
if(tmp.length()==1) C.push_back(tmp);
T.push_back(tmp);
}
while(getline(cin,tmp))
{
S.push_back(tmp);
}
in_range(i,0,S.size())
{
string s=S[i];
if(s=="") continue; // отсекаем случай пустой строки
if(s.length()==1) // в случае строки единичной длины ищем вхождения образцов из С простым перебором
{
in_range(j,0,C.size())
{
string c=C[j];
if(s==c)
{
cout << s << "\n";
break;
}
}
continue;
}
in_range(j,0,n) // во всех остальных случаях ищем вхождения строк из Т, используя алгоритм Рабина-Карпа
{
string t=T[j];
int pos = find_subctr(t,s);
if(pos>=0)
{
cout << s << "\n";
break;
}
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGluX3JhbmdlKHgseSx6KSBmb3IgKGludCB4PXk7IHg8ejsgeCsrKQp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKCmludCBmaW5kX3N1YmN0cihzdHJpbmcgdCwgc3RyaW5nIHMpCnsKICBjb25zdCBpbnQgcCA9IDk3OyAgLy8g0L7RgdC90L7QstCw0L3QuNC1INGB0LjRgdGC0LXQvNGLINGB0YfQuNGB0LvQtdC90LjRjyDQtNC70Y8g0YXQtdGI0LjRgNC+0LLQsNC90LjRjyDRgdGC0YDQvtC6CiAgLy8g0LLRi9GH0LjRgdC70Y/QtdC8INGB0YLQtdC/0LXQvdC4INGH0LjRgdC70LAgUCwg0YfRgtC+0LHRiyDRg9GB0LrQvtGA0LjRgtGMINC/0YDQvtGG0LXRgdGBINGF0LXRiNC40YDQvtCy0LDQvdC40Y8KICB2ZWN0b3I8bGw+IHBfcG93IChzLmxlbmd0aCgpKTsKICBwX3Bvd1swXSA9IDE7CiAgZm9yIChzaXplX3QgaT0xOyBpPHBfcG93LnNpemUoKTsgKytpKQogICAgcF9wb3dbaV0gPSBwX3Bvd1tpLTFdICogcDsKICAvLyDQstGL0YfQuNGB0LvRj9C10Lwg0YXQtdGI0Lgg0LLRgdC10YUg0L/RgNC10YTQuNC60YHQvtCyINGB0YLRgNC+0LrQuCBTCiAgdmVjdG9yPGxsPiBoIChzLmxlbmd0aCgpKTsKICBmb3IgKHNpemVfdCBpPTA7IGk8cy5sZW5ndGgoKTsgKytpKQogICAgewogICAgICBoW2ldID0gKHNbaV0gLSAndCcgKyAxKSAqIHBfcG93W2ldOwogICAgICBpZiAoaSkgIGhbaV0gKz0gaFtpLTFdOwogICAgfQogIC8vINC/0L7RgdGH0LjRgtCw0LXQvCDRhdC10Ygg0YHRgtGA0L7QutC4INCiCiAgbGwgaF90ID0gMDsKICBmb3IgKHNpemVfdCBpPTA7IGk8dC5sZW5ndGgoKTsgKytpKQogICAgaF90ICs9ICh0W2ldIC0gJ3QnICsgMSkgKiBwX3Bvd1tpXTsKICAvLyDRgdGA0LDQstC90LjQstCw0LXQvCDRhdC10YjQuCDRgdGC0YDQvtC60LggVCDQuCDQv9C+0LTRgdGC0YDQvtC6IFMg0LTQu9C40L3RiyB8VHwKICBmb3IgKHNpemVfdCBpID0gMDsgaSArIHQubGVuZ3RoKCkgLSAxIDwgcy5sZW5ndGgoKTsgKytpKQogICAgewogICAgICBsbCBjdXJfaCA9IGhbaSt0Lmxlbmd0aCgpLTFdOwogICAgICBpZiAoaSkgIGN1cl9oIC09IGhbaS0xXTsKICAgICAgLy8g0LXRgdC70Lgg0YDQsNCy0LXQvdGB0YLQstC+INCy0YvQv9C+0LvQvdGP0LXRgtGB0Y8g0YXQvtGC0Y8g0LHRiyDQvtC00LjQvSDRgNCw0LcsINC80Ysg0L/RgNC10LrRgNCw0YnQsNC10Lwg0L/QvtC40YHQugogICAgICBpZiAoY3VyX2ggPT0gaF90ICogcF9wb3dbaV0pCiAgICAgICAgcmV0dXJuIGludChpKTsKICAgIH0KICByZXR1cm4gLTE7Cn0KCmludCBtYWluKCkKewogIHZlY3RvcjxzdHJpbmc+VCxTLEM7IC8vINC90LDQsdC+0YDRiyDRgdGC0YDQvtC6IFQg0LggUywg0LAg0YLQsNC60LbQtSDQvdCw0LHQvtGAINC+0LHRgNCw0LfRhtC+0LIg0LXQtNC40L3QuNGH0L3QvtC5INC00LvQuNC90YsgQwogIGludCBuOwogIGNpbiA+PiBuOwogIHN0cmluZyB0bXA7CiAgZ2V0bGluZShjaW4sdG1wKTsKICBpbl9yYW5nZShpLDAsbikKICAgIHsKICAgICAgZ2V0bGluZShjaW4sdG1wKTsKICAgICAgaWYodG1wLmxlbmd0aCgpPT0xKSBDLnB1c2hfYmFjayh0bXApOwogICAgICBULnB1c2hfYmFjayh0bXApOwogICAgfQogIHdoaWxlKGdldGxpbmUoY2luLHRtcCkpCiAgICB7CiAgICAgIFMucHVzaF9iYWNrKHRtcCk7CiAgICB9CiAgaW5fcmFuZ2UoaSwwLFMuc2l6ZSgpKQogICAgewogICAgICBzdHJpbmcgcz1TW2ldOwogICAgICBpZihzPT0iIikgY29udGludWU7IC8vINC+0YLRgdC10LrQsNC10Lwg0YHQu9GD0YfQsNC5INC/0YPRgdGC0L7QuSDRgdGC0YDQvtC60LgKICAgICAgaWYocy5sZW5ndGgoKT09MSkgLy8g0LIg0YHQu9GD0YfQsNC1INGB0YLRgNC+0LrQuCDQtdC00LjQvdC40YfQvdC+0Lkg0LTQu9C40L3RiyDQuNGJ0LXQvCDQstGF0L7QttC00LXQvdC40Y8g0L7QsdGA0LDQt9GG0L7QsiDQuNC3INChINC/0YDQvtGB0YLRi9C8INC/0LXRgNC10LHQvtGA0L7QvAogICAgICAgIHsKICAgICAgICAgIGluX3JhbmdlKGosMCxDLnNpemUoKSkKICAgICAgICAgIHsKICAgICAgICAgICAgc3RyaW5nIGM9Q1tqXTsKICAgICAgICAgICAgaWYocz09YykKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb3V0IDw8IHMgPDwgIlxuIjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgaW5fcmFuZ2UoaiwwLG4pIC8vINCy0L4g0LLRgdC10YUg0L7RgdGC0LDQu9GM0L3Ri9GFINGB0LvRg9GH0LDRj9GFINC40YnQtdC8INCy0YXQvtC20LTQtdC90LjRjyDRgdGC0YDQvtC6INC40Lcg0KIsINC40YHQv9C+0LvRjNC30YPRjyDQsNC70LPQvtGA0LjRgtC8INCg0LDQsdC40L3QsC3QmtCw0YDQv9CwCiAgICAgIHsKICAgICAgICBzdHJpbmcgdD1UW2pdOwogICAgICAgIGludCBwb3MgPSBmaW5kX3N1YmN0cih0LHMpOwogICAgICAgIGlmKHBvcz49MCkKICAgICAgICAgIHsKICAgICAgICAgICAgY291dCA8PCBzIDw8ICJcbiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICB9CiAgICB9CiAgcmV0dXJuIDA7Cn0KCg==