http://poj.org/problem?id=1204
#include<string.h>
#include<stdio.h>
#define M 1010
char ss[M][M];
char str[M*2];
int L,C,W;
int tot;
int len[M];
int ans[M][3];
int dir[8][2]=
{{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
// A B C D E F G H
struct node
{
node *next[26];
node *fail;
int no;
}T[M*M],*que[M*M];
node *Getnewnode()
{
memset(T[tot].next,0,sizeof(int)*26);
T[tot].no=-1;
return &T[tot++];
}
void Insert(int inp,char s[],node *p)
{
int i;
for(i=0;s[i];i++)
{
int tmp=s[i]-'A';
if(p->next[tmp])
p=p->next[tmp];
else
{
p->next[tmp]=Getnewnode();
p=p->next[tmp];
}
}
p->no=inp;
}
void BuildAC(node *p)
{
int i;
int L=0,R=0;
for(i=0;i<26;i++)
{
if(p->next[i])
{
que[R++]=p->next[i];
p->next[i]->fail=p;
}
else
p->next[i]=p;
}
while(L<R)
{
p=que[L++];
for(i=0;i<26;i++)
{
if(p->next[i])
{
que[R++]=p->next[i];
p->next[i]->fail=p->fail->next[i];
}
else
p->next[i]=p->fail->next[i];
}
}
}
void Search(int x,int y,int k,node *p)
{
int i,j;
for(i=x,j=y;i>=0&&i<L&&j>=0&&j<C;i+=dir[k][0],j+=dir[k][1])
{
int tmp=ss[i][j]-'A';
p=p->next[tmp];
if(p->no!=-1)
{
ans[p->no][0]=i-dir[k][0]*len[p->no];
ans[p->no][1]=j-dir[k][1]*len[p->no];
ans[p->no][2]=k;
p->no=-1;
}
}
}
int main()
{
int i,j;
scanf("%d%d%d",&L,&C,&W);
tot=0;
node *root=Getnewnode();
for(i=0;i<L;i++)
scanf("%s",ss[i]);
for(i=0;i<W;i++)
{
scanf("%s",str);
len[i]=strlen(str)-1;
Insert(i,str,root);
}
BuildAC(root);
memset(ans,0,sizeof(ans));
for(i=0;i<C;i++)
for(j=0;j<8;j++)
{
Search(0,i,j,root);
Search(L-1,i,j,root);
}
for(i=0;i<L;i++)
for(j=0;j<8;j++)
{
Search(i,0,j,root);
Search(i,C-1,j,root);
}
for(i=0;i<W;i++)
printf("%d %d %c\n",ans[i][0],ans[i][1],ans[i][2]+'A');
return 0;
}