poj 1204
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; }