trie
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int MAX = 1000;
const int SON = 26;
struct Point
{
int r;
int c;
int dir;
Point (int r=0, int c=0, int dir=0)
{
this->r = r;
this->c = c;
this->dir = dir;
}
};
struct Tree
{
int mark;
Tree* son[SON];
void clear()
{
mark = 0;
for (int i = 0; i < SON; i++)
son[i] = NULL;
}
} root;
bool visit[MAX+2];
char table[MAX+2][MAX+2];
char word[MAX+2][MAX+2];
struct Point ans[MAX+2];
void read_table(int, int);
void read_words(int);
void create_tree(int);
void walk_tree(int, int);
int main()
{
int r, c, n;
scanf("%d%d%d", &r, &c, &n);
read_table(r, c);
read_words(n);
create_tree(n);
walk_tree(r, c);
for (int i = 0; i < n; i++)
printf("%d %d %c\n", ans[i].r-1, ans[i].c-1, ans[i].dir+'A');
return 0;
}
int max(int a, int b)
{
return (a > b) ? a : b;
}
void read_table(int r, int c)
{
int ch;
for (int i = 1; i <= r; i++)
for (int j = 1; j <= c; j++)
{
while (!isalpha(ch=getchar()))
;
table[i][j] = ch;
}
}
void read_words(int n)
{
for (int i = 0; i < n; i++)
scanf("%s", word[i]);
}
void insert_tree(char *str, int ord)
{
Tree *p = &root;
int id;
while (*str)
{
id = *str-'A';
if (p->son[id] == NULL)
{
p->son[id] = (struct Tree *)(malloc(sizeof(struct Tree)));
p->son[id]->clear();
}
p = p->son[id];
str++;
}
p->mark = ord;
}
void find_tree(int r, int c, int dir, struct Point *ans)
{
static const int ROW[] = {-1, -1, 0, 1, 1, 1, 0, -1};
static const int COL[] = {0, 1, 1, 1, 0, -1, -1, -1};
Tree *p = &root;
int id;
int row = r;
int col = c;
while (isalpha(table[r][c]))
{
id = table[r][c] - 'A';
if (p->son[id] == NULL)
return;
p = p->son[id];
if (p->mark && !visit[p->mark])
{
visit[p->mark] = true;
ans[p->mark-1] = Point(row, col, dir);
}
r += ROW[dir];
c += COL[dir];
}
}
void create_tree(int n)
{
root.clear();
for (int i = 0 ; i < n; i++)
insert_tree(word[i], i+1);
}
void walk_tree(int r, int c)
{
for (int i = 1; i <= r; i++)
for (int j = 1; j <= c; j++)
{
for (int k = 0; k < 8; k++)
find_tree(i, j, k, ans);
}
}