POJ 1204 Word Puzzles(AC自动机)
来源:互联网 发布:淘宝详情页视频时间 编辑:程序博客网 时间:2024/05/17 07:27
每次找到了一个串的头,就要回去找他的前驱结点因为有可能模式串为abcd bcd如果不找前驱结点bcd的开始位置永远找不到。
//// main.cpp// Richard//// Created by 邵金杰 on 16/9/2.// Copyright © 2016年 邵金杰. All rights reserved.//#include<iostream>#include<cstdio>#include<string>#include<algorithm>#include<queue>#include<vector>#include<cstring>using namespace std;const int maxn=1000000+100;const int N=1000+10;string map[N];struct node{ node *child[26]; node *pre; int pos; bool badnode; void intial(){ memset(child,0,sizeof(child)); pos=0; badnode=false; pre=NULL; }}tree[maxn];int ncount;pair<int,int> pa[N];char dire[N];string s;int r,c,w;const int dx[]={-1,-1,0,1,1, 1, 0,-1};const int dy[]={ 0, 1,1,1,0,-1,-1,-1};const char dir[]={"EFGHABCD"};void Insert(node *p,int no){ for(int i=0;s[i];i++) { if(p->child[s[i]-'A']==NULL) { p->child[s[i]-'A']=tree+ncount; ncount++; } p=p->child[s[i]-'A']; } p->badnode=true; p->pos=no;}void BuildDFA(){ for(int i=0;i<26;i++) tree[0].child[i]=tree+1; tree[0].pre=NULL; tree[1].pre=tree; queue<node*> q; q.push(tree+1); while(!q.empty()) { node *proot=q.front(); q.pop(); for(int i=0;i<26;i++) { node *p=proot->child[i]; if(p) { node *pre=proot->pre; while(pre) { if(pre->child[i]!=NULL) { p->pre=pre->child[i]; break; } else pre=pre->pre; } q.push(p); } } }}bool inside(int x,int y){ return x>=0&&x<r&&y>=0&&y<c;}void searchDFA(int i,int j,int k){ node *p=tree+1; int x=i,y=j; while(true) { if(!inside(x,y)) break; while(true) { if(p->child[map[x][y]-'A']!=NULL){ p=p->child[map[x][y]-'A']; node *pre=p; while(pre->badnode) { if(pre->pos){ pa[pre->pos].first=x; pa[pre->pos].second=y; dire[pre->pos]=dir[k]; pre->pos=0; } pre=pre->pre; } break; } else p=p->pre; } x+=dx[k]; y+=dy[k]; }}void work(){ for(int i=0;i<r;i++) { searchDFA(i,0,2); searchDFA(i,c-1,6); searchDFA(i,0,1); searchDFA(i,0,3); searchDFA(i,c-1,7); searchDFA(i,c-1,5); } for(int j=0;j<c;j++) { searchDFA(0,j,4); searchDFA(r-1,j,0); searchDFA(0,j,5); searchDFA(0,j,3); searchDFA(r-1,j,1); searchDFA(r-1,j,7); } for(int i=1;i<=w;i++) { cout<<pa[i].first<<' '<<pa[i].second<<' '<<dire[i]<<endl; }}int main(){ cin>>r>>c>>w; ncount=2; for(int i=0;i<r;i++) cin>>map[i]; for(int i=1;i<=w;i++) { cin>>s; reverse(s.begin(),s.end()); Insert(tree+1,i); } BuildDFA(); work(); return 0;}
0 0
- poj 1204:Word Puzzles(AC自动机)
- poj - 1204 - Word Puzzles(AC自动机)
- POJ 1204 Word Puzzles(AC自动机)
- poj 1204 Word Puzzles AC自动机
- POJ 1204 Word Puzzles AC自动机
- poj 1204 Word Puzzles (AC自动机)
- POJ 1204 Word Puzzles AC自动机题解
- poj 1204 Word Puzzles (ac自动机)
- POJ 1204 Word Puzzles (AC自动机)
- POJ 1204 Word Puzzles AC自动机 -
- POJ 1204 Word Puzzles ac自动机
- [POJ 1204]Word Puzzles(Trie树暴搜&AC自动机)
- SPOJ WPUZZLES (POJ 1204) 413.Word Puzzles AC自动机
- POJ 题目1204 Word Puzzles(AC自动机,多个方向查询)
- POJ1204 Word Puzzles AC自动机
- POJ1204--Word Puzzles--AC自动机
- 【POJ1204】Word Puzzles-AC自动机
- 【POJ1204】Word Puzzles——AC自动机
- jdbc 查
- .net实现支付宝在线支付
- Android5.0之CardView
- 剑指offer面试题18:树的子结构
- NOIP2015运输计划 题解
- POJ 1204 Word Puzzles(AC自动机)
- Codeforces Round #164 (Div. 2) C. Beautiful Sets of Points【思维题】
- jdbc 增删改
- 数据结构实验之链表三:链表的逆置
- JavaIO之OJ上面的输入输出
- [leetcode]11. Container With Most Water
- POJ 3320 Jessica's Reading Problem (HASH, 尺取法)
- 【Python】Python_learning10_1:Python中的素数筛选(方法一)
- POJ 2139 Six Degrees of Cowvin Bacon(最短路)