POJ 1204

来源:互联网 发布:中文域名前景 编辑:程序博客网 时间:2024/06/09 21:52

http://poj.org/problem?id=1204

#include<string.h>#include<stdio.h>#define M 1010char 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       Hstruct 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;}


 

原创粉丝点击