ac自动机的题。
代码:
#include <iostream>
using namespace std;
const int N=1010;
int n,m,w;
struct trie
{
int nxt[27];
int num,fl,id,len;
}ac[N*N];
int q[N*N];
char a[N][N],c[N];
int idx;
struct nod
{
int x,y;
char c;
}ans[N];
void add(char c[],int id,int len)
{
int p=0;
for(int i=0;c[i];i++)
{
int x=c[i]-'A';
if(ac[p].nxt[x]==0)
ac[p].nxt[x]=++idx;
p=ac[p].nxt[x];
}
ac[p].num++;
ac[p].id=id;
ac[p].len=len;
}
bool yes(int i,int j)
{
return i>=0&&j>=0&&i<n&&j<m;
}
void work(int x,int y,int dx,int dy,char c)
{
int i,j,p;
for(i=x,j=y,p=0;yes(i,j);)
{
int ix=a[i][j]-'A';
if(ac[p].nxt[ix])
{
p=ac[p].nxt[ix];
if(ac[p].num>0)
{
int id=ac[p].id;
ans[id].x=i-(ac[p].len-1)*dx,ans[id].y=j-(ac[p].len-1)*dy,ans[id].c=c,ac[p].num=-1;
}
i+=dx,j+=dy;
}
else if(p)
{
p=ac[p].fl;
if(ac[p].num>0)
{
int id=ac[p].id;
ans[id].x=i-(ac[p].len-1)*dx,ans[id].y=j-(ac[p].len-1)*dy,ans[id].c=c,ac[p].num=-1;
}
}
else
i+=dx,j+=dy;
}
}
int main()
{
scanf("%d%d%d",&n,&m,&w);
int i,j;
for(i=0;i<n;i++)
scanf("%s",a[i]);
idx=0;
for(i=1;i<=w;i++)
{
scanf("%s",c);
add(c,i,strlen(c));
}
int t=-1,h=-1;
q[++t]=0;
ac[0].fl=-1;
while(h!=t)
{
int u=q[++h];
for(i=0;i<26;i++)
{
int tmp=ac[u].nxt[i];
if(tmp==0)
continue;
int p;
for(p=ac[u].fl;p!=-1;p=ac[p].fl)
if(ac[p].nxt[i])
{
ac[tmp].fl=ac[p].nxt[i];
break;
}
if(p==-1)
ac[tmp].fl=0;
q[++t]=tmp;
}
}
for(j=0;j<m;j++)work(n-1,j,-1,0,'A');
for(i=0;i<n;i++)work(i,0,-1,1,'B');
for(j=0;j<m;j++)work(n-1,j,-1,1,'B');
for(i=0;i<n;i++)work(i,0,0,1,'C');
for(i=0;i<n;i++)work(i,0,1,1,'D');
for(j=0;j<m;j++)work(0,j,1,1,'D');
for(j=0;j<m;j++)work(0,j,1,0,'E');
for(j=0;j<m;j++)work(0,j,1,-1,'F');
for(i=0;i<n;i++)work(i,m-1,1,-1,'F');
for(i=0;i<n;i++)work(i,m-1,0,-1,'G');
for(i=0;i<n;i++)work(i,m-1,-1,-1,'H');
for(j=0;j<m;j++)work(n-1,j,-1,-1,'H');
for(i=1;i<=w;i++)
printf("%d %d %c\n",ans[i].x,ans[i].y,ans[i].c);
return 0;
}