[POJ1204 Word Puzzles]

[关键字]:字符串

[题目大意]:求出所给出的每个单词在整个字母方阵中出现的坐标和方向。

//=====================================================================================================

[分析]:先按每个要求的单词建立字典树,然后枚举每种方向的起点,保证对每个方向的搜索都能够覆盖全图,进行多模式匹配。

[代码]:

View Code
  1 #include<iostream>
2 #include<cstdio>
3 #include<cstdlib>
4 #include<algorithm>
5 #include<queue>
6 using namespace std;
7 struct node
8 {
9 int len,id,num,fail;
10 int next[26];
11 }ac[100000];
12 struct rec
13 {
14 int x,y;
15 char c;
16 }ans[1010];
17 int n,m,w,tn;
18 char a[1010][1010],s[1010];
19
20 int ins(char *s,int id,int len)
21 {
22 int p=0,index;
23 for (int i=0;s[i];i++)
24 {
25 index=s[i]-'A';
26 if (ac[p].next[index]==0) ac[p].next[index]=++tn;
27 p=ac[p].next[index];
28 }
29 ac[p].id=id;
30 ac[p].len=len;
31 ac[p].num++;
32 return 0;
33 }
34
35 int build()
36 {
37 queue<int> q;
38 ac[0].fail=-1;
39 q.push(0);
40 while (!q.empty())
41 {
42 int u=q.front();
43 q.pop();
44 for (int i=0;i<26;i++)
45 {
46 int temp=ac[u].next[i],p;
47 if (temp)
48 {
49 for (p=ac[u].fail;p!=-1;p=ac[p].fail)
50 if (ac[p].next[i]) {ac[temp].fail=ac[p].next[i];break;}
51 if (p==-1) ac[temp].fail=0;
52 q.push(temp);
53 }
54 }
55 }
56 return 0;
57 }
58
59 /*int work(int x,int y,int dx,int dy,char c)
60 {
61 for (int i=x,j=y,p=0;cleck(i,j);)
62 {
63 index=a[i][j]-'A';
64 while (ac[p].next[index]==0 && p) p=ac[p].fail;
65 p=ac[p].next[index];
66 int temp=p;
67 while (temp && ac[temp].num>0)
68 {
69 int id=ac[temp].id;
70 ans[id].x=i-(ac[temp].len-1)*dx;
71 ans[id].y=j-(ac[temp].len-1)*dy;
72 ans[id].c=c;
73 ac[temp].num=-1;
74 }
75 i+=dx,j+=dy;
76 }
77 return 0;
78 }*/
79
80 bool cleck(int i,int j)
81 {
82 return i>=0 && j>=0 && i<n && j<m;
83 }
84
85 int work(int x,int y,int dx,int dy,char c)
86 {
87 int index,id;
88 for (int i=x,j=y,p=0;cleck(i,j);)
89 {
90 index=a[i][j]-'A';
91 if (ac[p].next[index])
92 {
93 p=ac[p].next[index];
94 if (ac[p].num>0)
95 {
96 id=ac[p].id;
97 ans[id].x=i-(ac[p].len-1)*dx;
98 ans[id].y=j-(ac[p].len-1)*dy;
99 ans[id].c=c;
100 ac[p].num=-1;
101 }
102 i+=dx,j+=dy;
103 }
104 else
105 if (p)
106 {
107 p=ac[p].fail;
108 if (ac[p].num>0)
109 {
110 id=ac[p].id;
111 ans[id].x=i-(ac[p].len-1)*dx;
112 ans[id].y=j-(ac[p].len-1)*dy;
113 ans[id].c=c;
114 ac[p].num=-1;
115 }
116 }
117 else i+=dx,j+=dy;
118 }
119 return 0;
120 }
121
122 int main()
123 {
124 scanf("%d%d%d",&n,&m,&w);
125 for (int i=0;i<n;i++) scanf("%s",a[i]);
126 tn=0;
127 for (int i=0;i<w;i++) {scanf("%s",s);ins(s,i,strlen(s));}
128 build();
129 for (int i=0;i<m;i++) work(n-1,i,-1,0,'A');
130
131 for (int i=0;i<n;i++) work(i,0,-1,1,'B');
132 for (int i=0;i<m;i++) work(n-1,i,-1,1,'B');
133
134 for (int i=0;i<n;i++) work(i,0,0,1,'C');
135
136 for (int i=0;i<n;i++) work(i,0,1,1,'D');
137 for (int i=0;i<m;i++) work(0,i,1,1,'D');
138
139 for (int i=0;i<m;i++) work(0,i,1,0,'E');
140
141 for (int i=0;i<n;i++) work(i,m-1,1,-1,'F');
142 for (int i=0;i<m;i++) work(0,i,1,-1,'F');
143
144 for (int i=0;i<n;i++) work(i,m-1,0,-1,'G');
145
146 for (int i=0;i<n;i++) work(i,m-1,-1,-1,'H');
147 for (int i=0;i<m;i++) work(n-1,i,-1,-1,'H');
148 for (int i=0;i<w;i++) printf("%d %d %c\n",ans[i].x,ans[i].y,ans[i].c);
149 system("pause");
150 return 0;
151 }



你可能感兴趣的:(word)