Word Puzzle 字典树实现 AC自动机实现 /* * File: main.cpp * Author: Mi * * Created on 2011年4月20日, 下午4:10 */ #include <cstdlib> #include <stdio.h> #include <algorithm> #include <string.h> #define KIND 26 #define MAX 10005 using namespace std; /* * */ char msg[MAX][MAX]; int d[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}},n,m; int ans[MAX][3],len[MAX]; bool ok(int x,int y) { return x>=0&&x<n&&y>=0&&y<m; } struct node { node *fail; node *next[KIND]; int num; node() { fail=NULL; memset(next,NULL,sizeof(next)); num=-1; } }*root; void Insert(node *root,char *str,int num) { node *p=root; for(int i=0;str[i];i++) { int Index=str[i]-'A'; if(p->next[Index]==NULL) p->next[Index]=new node(); p=p->next[Index]; } p->num=num; } void Search(node *root,int x,int y,int k) { node *p=root; int xx=x,yy=y; while(ok(xx,yy)) { int Index=msg[xx][yy]-'A'; if(p->next[Index]==NULL) break; else p=p->next[Index]; if(p->num!=-1) { ans[p->num][0]=xx-len[p->num]*d[k][0]; ans[p->num][1]=yy-len[p->num]*d[k][1]; ans[p->num][2]=k+'A'; } xx+=d[k][0]; yy+=d[k][1]; } } void solve() { int w; root=new node(); scanf("%d%d%d",&n,&m,&w); for(int i=0;i<n;i++) scanf("%s",msg[i]); for(int i=0;i<w;i++) { char str[MAX]; scanf("%s",str); Insert(root,str,i); len[i]=strlen(str)-1; } for(int i=0;i<n;i++) for(int j=0;j<n;j++) // if(i==0||j==0||i==n-1||j==m-1) for(int k=0;k<8;k++) Search(root,i,j,k); for(int i=0;i<w;i++) printf("%d %d %c/n",ans[i][0],ans[i][1],ans[i][2]); } int main(int argc, char** argv) { solve(); return 0; }