poj 1204 Word Puzzles
2011-08-23 09:03
453 查看
我不改了!!200行就200行了 T T。。。兴海才130+。。。我都写200+。。。想压缩下,越弄越WA。。。
AC自动机水题。。但是ZOJ这题我过不去,ZOJ没有加SPJ = =。。
AC自动机水题。。但是ZOJ这题我过不去,ZOJ没有加SPJ = =。。
#include <map> #include <set> #include <queue> #include <stack> #include <math.h> #include <time.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <string> #include <algorithm> #define MID(x,y) ( ( x + y ) >> 1 ) #define L(x) ( x << 1 ) #define R(x) ( x << 1 | 1 ) #define BUG puts("here!!!") #define STOP system("pause") using namespace std; const int MAX_N = 26; struct NODE{ int id; int len; // 模式串的长度 NODE *next[MAX_N], *fail; NODE() { id = -1; fail = NULL; memset(next, 0, sizeof(next)); } }*head; void Build_trie(char *s,NODE *head,int id) { int len = strlen(s); for(int i=0; i<len; i++) { int k = s[i] - 'A'; if( head->next[k] == NULL ) head->next[k] = new NODE(); head = head->next[k]; } head->id = id; head->len = len; } queue<NODE*> q; void Build_fail(NODE *head) { head->fail = NULL; q.push(head); while( !q.empty() ) { NODE *now = q.front(); q.pop(); for(int i=0; i<MAX_N; i++) if( now->next[i] ) { NODE *p = now->fail; while( p ) { if( p->next[i] ) { now->next[i]->fail = p->next[i]; break; } p = p->fail; } if( p == NULL ) now->next[i]->fail = head; q.push(now->next[i]); } } } struct COUNT{ int x,y; char dir; }; COUNT cnt[1010]; char DIR; pair<int,int> a[1010]; void AC_find(NODE *head, char *s) { int len = strlen(s), sum = 0; NODE* p = head; for(int i=0; i<len; i++) { if( !isupper(s[i]) ) { p = head; continue; } int k = s[i] - 'A'; while( p->next[k] == NULL && p != head ) p = p->fail; p = p->next[k] == NULL ? head : p->next[k]; NODE *tmp = p; while( tmp != head ) { if( tmp->id != -1 ) { cnt[tmp->id].x = a[i-tmp->len+1].first; cnt[tmp->id].y = a[i-tmp->len+1].second; cnt[tmp->id].dir = DIR; } tmp = tmp->fail; } } } char tab[1005][1005]; char words[1005][1005]; char s[1005]; int main() { int n, m, w; while( ~scanf("%d%d%d", &n, &m, &w) ) { head = new NODE(); for(int i=0; i<n; i++) scanf("%s", tab[i]); for(int i=0; i<w; i++) { scanf("%s", words[i]); Build_trie(words[i], head, i); } Build_fail( head ); for(int i=0; i<n; i++) // → { DIR = 'C'; int p = 0; for(int k=0; k<m; k++) { a[p] = make_pair(i,k); s[p++] = tab[i][k]; } AC_find( head, s); DIR = 'G'; // ← for(int k=0; k<p/2; k++) { swap(a[k], a[p-k-1]); swap(s[k], s[p-k-1]); } AC_find( head, s); } for(int i=0; i<m; i++) // ↓ { DIR = 'E'; int p = 0; for(int k=0; k<n; k++) { a[p] = make_pair(k,i); s[p++] = tab[k][i]; } s[p] = '\0'; AC_find( head, s); DIR = 'A'; for(int k=0; k<p/2; k++)// ↑ { swap(a[k], a[p-k-1]); swap(s[k], s[p-k-1]); } AC_find( head, s); } for(int i=0; i<n; i++) { DIR = 'B'; // 右上 int p = 0, x = i, y = 0; while( x >= 0 && y < m ) { a[p] = make_pair(x,y); s[p++] = tab[x][y]; x--; y++; } s[p] = '\0'; AC_find( head, s); DIR = 'F'; //左下 for(int k=0; k<p/2; k++) { swap(a[k], a[p-k-1]); swap(s[k], s[p-k-1]); } AC_find( head, s); } for(int i=1; i<m; i++) { DIR = 'B'; // 右上 int p = 0, x = n-1, y = i; while( x >= 0 && y < m ) { a[p] = make_pair(x,y); s[p++] = tab[x][y]; x--; y++; } s[p] = '\0'; AC_find( head, s); DIR = 'F'; //左下 for(int k=0; k<p/2; k++) { swap(a[k], a[p-k-1]); swap(s[k], s[p-k-1]); } AC_find( head, s); } for(int i=0; i<n; i++) { DIR = 'D'; // 右下 int p = 0, x = i, y = 0; while( x < n && y < m ) { a[p] = make_pair(x,y); s[p++] = tab[x][y]; x++; y++; } s[p] = '\0'; AC_find( head, s); DIR = 'H'; //左上 for(int k=0; k<p/2; k++) { swap(a[k], a[p-k-1]); swap(s[k], s[p-k-1]); } AC_find( head, s); } for(int i=1; i<m; i++) { DIR = 'D'; // 右下 int p = 0, x = 0, y = i; while( x < n && y < m ) { a[p] = make_pair(x,y); s[p++] = tab[x][y]; x++; y++; } s[p] = '\0'; AC_find( head, s); DIR = 'H'; //左上 for(int k=0; k<p/2; k++) { swap(a[k], a[p-k-1]); swap(s[k], s[p-k-1]); } AC_find( head, s); } for(int i=0; i<w; i++) printf("%d %d %c\n",cnt[i].x, cnt[i].y, cnt[i].dir); } return 0; }
相关文章推荐
- poj1204 Word Puzzles
- poj 字符串相关之1204 Word Puzzles
- POJ 1204 Word Puzzles 笔记
- poj 1204 Word Puzzles
- 【 POJ - 1204 Word Puzzles】(Trie+爆搜|AC自动机)
- poj - 1204 - Word Puzzles(AC自动机)
- POJ-1204 Word Puzzles AC自动机 多串匹配
- [poj] 1204 Word Puzzles || AC自动机
- poj 1204 Word Puzzles 字典树 + 暴搜
- poj1204——Word Puzzles
- poj 1204 Word Puzzles(字典树)
- poj 1204:Word Puzzles(AC自动机)
- POJ1204 Word Puzzles
- 【POJ】1204 Word Puzzles
- POJ 1204 Word Puzzles
- ACM篇:POJ 1204--Word Puzzles
- POJ1204--Word Puzzles--AC自动机
- POJ1204 Word Puzzles
- poj 1204 Word Puzzles
- Word Puzzles - POJ 1204 Trie树