/*
Given a grid of characters of size n*m and q words in a dictionary.
Print the words that lie in the grid. (Diagonal movement allowed)
Data Structure Used - Trie
Time Complexity - O(n*m*k) where k is the length of the longest word in the dictionary
Author - hiteshpardasani99
*/
#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define ff first
#define ss second
#define pll pair<ll,ll>
using namespace std;
struct node
{
bool leaf; //if the node is a leaf then, a word in the dictionary ends at this node.
node* child[26];
};
node* create()
{
node* ret = new node();
for(int i=0;i<26;i++)ret->child[i]=NULL;
ret->leaf=false;
return ret;
}
ll n,m,q;
char grid[1001][1001]; //input grid
int vis[1001][1001]; //visit array for dfs
string dict[100005]; //Dictionary
vector<char> ans;
set<vector<char>> s; //Set to store the answer
pll dir[8]={{-1,-1},{-1,0},{-1,1},{0,1},{0,-1},{1,1},{1,0},{1,-1}};
node* root=create();
void add(string x)
{
node* ex=root; // to keep a copy of root
for(int i=0;i<x.length();i++)
{
if(root->child[x[i]-'a']==NULL)
{
root->child[x[i]-'a']=create();
}
root=root->child[x[i]-'a'];
}
root->leaf=true;
root=ex;
}
bool check(pll ne)
{
return (ne.ff>=0&&ne.ss>=0&&ne.ff<n&&ne.ss<m);
}
void dfs(pll c)
{
if(root->child[grid[c.ff][c.ss]-'a']!=NULL) //if the current char is present in trie
{
node *ex=root;
root = root->child[grid[c.ff][c.ss]-'a'];
ans.pb(grid[c.ff][c.ss]);
vis[c.ff][c.ss]=1;
for(int i=0;i<8;i++) //to check in all the directions
{
pll ne={c.ff+dir[i].ff,c.ss+dir[i].ss};
if(check(ne)&&!vis[ne.ff][ne.ss])
{
dfs(ne);
}
}
root=ex;
ans.pop_back();
vis[c.ff][c.ss]=0;
}
else
{
if(root->leaf && ans.size())
{
s.insert(ans);
}
}
}
void solve()
{
node* ex=root;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
pll curr={i,j};
root = ex;
dfs(curr); //check from every possible starting point
}
}
for(auto it=s.begin();it!=s.end();it++)
{
vector<char> v=*it;
for(int i=0;i<v.size();i++)cout<<v[i];cout<<endl;
}
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)cin>>grid[i][j];
}
cin>>q;
for(int i=0;i<q;i++)
{
cin>>dict[i];
add(dict[i]);
}
solve();
return 0;
}
LyoKR2l2ZW4gYSBncmlkIG9mIGNoYXJhY3RlcnMgb2Ygc2l6ZSBuKm0gYW5kIHEgd29yZHMgaW4gYSBkaWN0aW9uYXJ5LgpQcmludCB0aGUgd29yZHMgdGhhdCBsaWUgaW4gdGhlIGdyaWQuIChEaWFnb25hbCBtb3ZlbWVudCBhbGxvd2VkKQoKRGF0YSBTdHJ1Y3R1cmUgVXNlZCAtIFRyaWUKVGltZSBDb21wbGV4aXR5IC0gTyhuKm0qaykgd2hlcmUgayBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBsb25nZXN0IHdvcmQgaW4gdGhlIGRpY3Rpb25hcnkKCkF1dGhvciAtIGhpdGVzaHBhcmRhc2FuaTk5CiovCgojaW5jbHVkZTxiaXRzL3N0ZGMrKy5oPgojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGZmIGZpcnN0CiNkZWZpbmUgc3Mgc2Vjb25kCiNkZWZpbmUgcGxsIHBhaXI8bGwsbGw+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3Qgbm9kZQp7CiAgICBib29sIGxlYWY7ICAvL2lmIHRoZSBub2RlIGlzIGEgbGVhZiB0aGVuLCBhIHdvcmQgaW4gdGhlIGRpY3Rpb25hcnkgZW5kcyBhdCB0aGlzIG5vZGUuCiAgICBub2RlKiBjaGlsZFsyNl07Cn07Cgpub2RlKiBjcmVhdGUoKQp7CiAgICBub2RlKiByZXQgPSBuZXcgbm9kZSgpOwogICAgZm9yKGludCBpPTA7aTwyNjtpKyspcmV0LT5jaGlsZFtpXT1OVUxMOwogICAgcmV0LT5sZWFmPWZhbHNlOwogICAgcmV0dXJuIHJldDsKfQoKbGwgbixtLHE7CmNoYXIgZ3JpZFsxMDAxXVsxMDAxXTsgIC8vaW5wdXQgZ3JpZAppbnQgdmlzWzEwMDFdWzEwMDFdOyAgICAvL3Zpc2l0IGFycmF5IGZvciBkZnMKc3RyaW5nIGRpY3RbMTAwMDA1XTsgICAgLy9EaWN0aW9uYXJ5CnZlY3RvcjxjaGFyPiBhbnM7CnNldDx2ZWN0b3I8Y2hhcj4+IHM7ICAgIC8vU2V0IHRvIHN0b3JlIHRoZSBhbnN3ZXIKcGxsIGRpcls4XT17ey0xLC0xfSx7LTEsMH0sey0xLDF9LHswLDF9LHswLC0xfSx7MSwxfSx7MSwwfSx7MSwtMX19OwoKbm9kZSogcm9vdD1jcmVhdGUoKTsKCnZvaWQgYWRkKHN0cmluZyB4KQp7CiAgICBub2RlKiBleD1yb290OyAgLy8gdG8ga2VlcCBhIGNvcHkgb2Ygcm9vdAogICAgZm9yKGludCBpPTA7aTx4Lmxlbmd0aCgpO2krKykKICAgIHsKICAgICAgICBpZihyb290LT5jaGlsZFt4W2ldLSdhJ109PU5VTEwpCiAgICAgICAgewogICAgICAgICAgICByb290LT5jaGlsZFt4W2ldLSdhJ109Y3JlYXRlKCk7CiAgICAgICAgfQogICAgICAgIHJvb3Q9cm9vdC0+Y2hpbGRbeFtpXS0nYSddOwogICAgfQogICAgcm9vdC0+bGVhZj10cnVlOwogICAgcm9vdD1leDsKfQoKYm9vbCBjaGVjayhwbGwgbmUpCnsKICAgIHJldHVybiAobmUuZmY+PTAmJm5lLnNzPj0wJiZuZS5mZjxuJiZuZS5zczxtKTsKfQoKdm9pZCBkZnMocGxsIGMpCnsKICAgIGlmKHJvb3QtPmNoaWxkW2dyaWRbYy5mZl1bYy5zc10tJ2EnXSE9TlVMTCkgLy9pZiB0aGUgY3VycmVudCBjaGFyIGlzIHByZXNlbnQgaW4gdHJpZQogICAgewogICAgICAgIG5vZGUgKmV4PXJvb3Q7CiAgICAgICAgcm9vdCA9IHJvb3QtPmNoaWxkW2dyaWRbYy5mZl1bYy5zc10tJ2EnXTsKICAgICAgICBhbnMucGIoZ3JpZFtjLmZmXVtjLnNzXSk7CiAgICAgICAgdmlzW2MuZmZdW2Muc3NdPTE7CiAgICAgICAgZm9yKGludCBpPTA7aTw4O2krKykgICAgICAgIC8vdG8gY2hlY2sgaW4gYWxsIHRoZSBkaXJlY3Rpb25zCiAgICAgICAgewogICAgICAgICAgICBwbGwgbmU9e2MuZmYrZGlyW2ldLmZmLGMuc3MrZGlyW2ldLnNzfTsKICAgICAgICAgICAgaWYoY2hlY2sobmUpJiYhdmlzW25lLmZmXVtuZS5zc10pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRmcyhuZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcm9vdD1leDsKICAgICAgICBhbnMucG9wX2JhY2soKTsKICAgICAgICB2aXNbYy5mZl1bYy5zc109MDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZihyb290LT5sZWFmICYmIGFucy5zaXplKCkpCiAgICAgICAgewogICAgICAgICAgICBzLmluc2VydChhbnMpOwogICAgICAgIH0KICAgIH0KfQoKdm9pZCBzb2x2ZSgpCnsKICAgIG5vZGUqIGV4PXJvb3Q7CiAgICBmb3IoaW50IGk9MDtpPG47aSsrKQogICAgewogICAgICAgIGZvcihpbnQgaj0wO2o8bTtqKyspCiAgICAgICAgewogICAgICAgICAgICBwbGwgY3Vycj17aSxqfTsKICAgICAgICAgICAgcm9vdCA9IGV4OwogICAgICAgICAgICBkZnMoY3Vycik7ICAvL2NoZWNrIGZyb20gZXZlcnkgcG9zc2libGUgc3RhcnRpbmcgcG9pbnQKICAgICAgICB9CiAgICB9CiAgICBmb3IoYXV0byBpdD1zLmJlZ2luKCk7aXQhPXMuZW5kKCk7aXQrKykKICAgIHsKICAgICAgICB2ZWN0b3I8Y2hhcj4gdj0qaXQ7CiAgICAgICAgZm9yKGludCBpPTA7aTx2LnNpemUoKTtpKyspY291dDw8dltpXTtjb3V0PDxlbmRsOwogICAgfQp9CgoKaW50IG1haW4oKQp7CiAgICBjaW4+Pm4+Pm07CiAgICBmb3IoaW50IGk9MDtpPG47aSsrKQogICAgewogICAgICAgIGZvcihpbnQgaj0wO2o8bTtqKyspY2luPj5ncmlkW2ldW2pdOwogICAgfQogICAgY2luPj5xOwogICAgZm9yKGludCBpPTA7aTxxO2krKykKICAgIHsKICAgICAgICBjaW4+PmRpY3RbaV07CiAgICAgICAgYWRkKGRpY3RbaV0pOwogICAgfQogICAgc29sdmUoKTsKICAgIHJldHVybiAwOwp9Cg==