就是8个方向搜索单词,主要位置的移动就OK了。
水水的AC自动机~~
这么长的数据,这么长的代码,直接1Y 爽爽的 O(∩_∩)O
#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"queue"
#include"algorithm"
#include"iostream"
using namespace std;
char aa[1234][1234];
int n,m;
struct aet
{
int x,y;
int f,l;
}ans[1234];
struct trie
{
int mark;
trie *next[27];
trie *fail;
trie()
{
mark=-1;
fail=NULL;
memset(next,0,sizeof(next));
}
}*root;
void judge(int id,aet xx)
{
if(xx.x!=ans[id].x)
{
if(xx.x<ans[id].x) ans[id]=xx;
}
else
{
if(xx.y<ans[id].y) ans[id]=xx;
}
}
void init(char *v,int id)
{
int i;
trie *p=root;
for(i=0;v[i];i++)
{
int tep=v[i]-'A';
if(p->next[tep]==NULL) p->next[tep]=new trie();
p=p->next[tep];
}
p->mark=id;
}
void getac()
{
queue<trie *>q;
q.push(root);
while(!q.empty())
{
trie *p,*tep;
int i;
p=q.front();
q.pop();
for(i=0;i<26;i++)
{
if(p->next[i]!=NULL)
{
if(p==root) p->next[i]->fail=root;
else
{
tep=p->fail;
while(tep!=NULL)
{
if(tep->next[i]!=NULL)
{
p->next[i]->fail=tep->next[i];
break;
}
tep=tep->fail;
}
if(tep==NULL) p->next[i]->fail=root;
}
q.push(p->next[i]);
}
}
}
}
aet fun(int x,int y,int f,int id)
{
aet res;
res.x=x;
res.y=y;
res.f=f;
res.l=ans[id].l;
int l=ans[id].l;
if(f==1)
{
res.x+=l;
}
else if(f==2)
{
res.x+=l;
res.y-=l;
}
else if(f==3)
{
res.y-=l;
}
else if(f==4)
{
res.x-=l;
res.y-=l;
}
else if(f==5)
{
res.x-=l;
}
else if(f==6)
{
res.x-=l;
res.y+=l;
}
else if(f==7)
{
res.y+=l;
}
else if(f==8)
{
res.x+=l;
res.y+=l;
}
return res;
}
int finde (int i,int j,int f)
{
int ans=0;
trie *p=root,*q;
while(i>=0&&j>=0&&i<n&&j<m)
{
int tep=aa[i][j]-'A';
while(p->next[tep]==NULL && p!=root)
p=p->fail;
p=p->next[tep];
if(p==NULL) p=root;
q=p;
while(q!=root && q->mark!=-1)
{
aet xx;
xx=fun(i,j,f,q->mark);
judge(q->mark,xx);
q=q->fail;
}
if(f==1) { i--; }
else if(f==2) { i--; j++; }
else if(f==3) { j++; }
else if(f==4) { i++; j++; }
else if(f==5) { i++; }
else if(f==6) { i++; j--; }
else if(f==7) { j--; }
else { i--; j--; }
}
return ans;
}
int main()
{
int k;
while(scanf("%d%d%d",&n,&m,&k)!=-1)
{
int i;
for(i=0;i<n;i++) scanf("%s",aa[i]);
root=new trie();
for(i=0;i<k;i++)
{
char x[12354];
scanf("%s",x);
ans[i].x=1005;
ans[i].y=1005;
ans[i].l=strlen(x)-1;
init(x,i);
}
getac();
for(i=0;i<n;i++)
{
finde(i,0,3);
finde(i,0,4);
finde(i,m-1,7);
finde(i,m-1,6);
}
for(i=n-1;i>=0;i--)
{
finde(i,0,2);
finde(i,m-1,8);
}
for(i=0;i<m;i++)
{
finde(0,i,5);
finde(0,i,4);
finde(n-1,i,1);
finde(n-1,i,2);
}
for(i=m-1;i>=0;i--)
{
finde(0,i,6);
finde(n-1,i,8);
}
for(i=0;i<k;i++)
{
printf("%d %d %c\n",ans[i].x,ans[i].y,ans[i].f+'A'-1);
}
}
}