标签:
Time Limit: 5000MS | Memory Limit: 65536K | |||
Total Submissions: 10244 | Accepted: 3864 | Special Judge |
Description
Input
Output
Sample Input
20 20 10 QWSPILAATIRAGRAMYKEI AGTRCLQAXLPOIJLFVBUQ TQTKAZXVMRWALEMAPKCW LIEACNKAZXKPOTPIZCEO FGKLSTCBTROPICALBLBC JEWHJEEWSMLPOEKORORA LUPQWRNJOAAGJKMUSJAE KRQEIOLOAOQPRTVILCBZ QOPUCAJSPPOUTMTSLPSF LPOUYTRFGMMLKIUISXSW WAHCPOIYTGAKLMNAHBVA EIAKHPLBGSMCLOGNGJML LDTIKENVCSWQAZUAOEAL HOPLPGEJKMNUTIIORMNC LOIUFTGSQACAXMOPBEIO QOASDHOPEPNBUYUYOBXB IONIAELOJHSWASMOUTRK HPOIYTJPLNAQWDRIBITG LPOINUYMRTEMPTMLMNBO PAFCOPLHAVAIANALBPFS MARGARITA ALEMA BARBECUE TROPICAL SUPREMA LOUISIANA CHEESEHAM EUROPA HAVAIANA CAMPONESA
Sample Output
0 15 G 2 11 C 7 18 A 4 8 C 16 13 B 4 15 E 10 3 D 5 1 E 19 7 C 11 11 H
Source
题目大意:给你一个矩阵,然后问每个串在矩阵中的起点和方向,方向从上(A)顺时针8个方向
就是也8个方向的查询就好。。
ac代码
#include<stdio.h> #include<string.h> char map[1010][1010],key[1010]; int dx[8]={-1,-1,0,1,1,1,0,-1}; int dy[8]={0,1,1,1,0,-1,-1,-1}; int ansx[1010],ansy[1010],ansd[1010],len[1010]; int head,tail; int n,m,w; struct node { node *fail; node *next[26]; int id; node() { fail=NULL; id=0; for(int i=0;i<26;i++) next[i]=NULL; } }*q[50005000]; node *root; void insert(char *s,int id) { int temp,len,i; node *p=root; len=strlen(s); for(i=0;i<len;i++) { temp=s[i]-'A'; if(p->next[temp]==NULL) p->next[temp]=new node(); p=p->next[temp]; } p->id=id; } void build_ac() { head=tail=0; q[tail++]=root; while(head!=tail) { node *p=q[head++]; node *temp=NULL; for(int i=0;i<26;i++) { if(p->next[i]!=NULL) { if(p==root) p->next[i]->fail=root; else { temp=p->fail; while(temp!=NULL) { if(temp->next[i]!=NULL) { p->next[i]->fail=temp->next[i]; break; } temp=temp->fail; } if(temp==NULL) { p->next[i]->fail=root; } } q[tail++]=p->next[i]; } } } } void query(int x,int y,int dir) { node *p=root,*temp; int i,j; for(i=x,j=y;i>=0&&i<n&&j>=0&&j<m;i+=dx[dir],j+=dy[dir]) { int x=map[i][j]-'A'; while(p->next[x]==NULL&&p!=root) p=p->fail; p=p->next[x]; if(p==NULL) { p=root; } temp=p; while(temp!=root&&temp->id!=-1) { int id=temp->id; ansx[id]=i-(len[id]-1)*dx[dir]; ansy[id]=j-(len[id]-1)*dy[dir]; ansd[id]=dir; temp->id=-1; temp=temp->fail; } } } int main() { // int n,m,w; while(scanf("%d%d%d",&n,&m,&w)!=EOF) { int i,j; root=new node(); for(i=0;i<n;i++) { scanf("%s",map[i]); } for(i=1;i<=w;i++) { scanf("%s",key); len[i]=strlen(key); insert(key,i); } build_ac(); for(i=0;i<m;i++) { for(j=0;j<8;j++) { query(0,i,j); query(n-1,i,j); } } for(i=0;i<n;i++) { for(j=0;j<8;j++) { query(i,0,j); query(i,m-1,j); } } for(i=1;i<=w;i++) { printf("%d %d %c\n",ansx[i],ansy[i],ansd[i]+'A'); } } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
POJ 题目1204 Word Puzzles(AC自动机,多个方向查询)
标签:
原文地址:http://blog.csdn.net/yu_ch_sh/article/details/47439299