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

大意:给出一个棋盘puzzle,,和w个模式串,,在棋盘中寻找模式串。。棋盘中任意一格有8个方向可以走。。

解题思路: AC自动机 + 枚举8个方向即可

get_trie(),get_ac().直接用模版。。。。

query 有一点小技巧。。需要枚举8个方向,,对于一行,我们对竖直方向上的枚举可以省略,因为我们在竖直方向上枚举时,会补充上。。

另外 我们无需枚举一行中的每一个点,,只需第一个即可,因为,,我们在一个方向上枚举时,,会包含到后面的。

 #include <iostream>
#include<cstring>
using namespace std;
struct point{
point *fail;
point *next[];
bool istail;//是否为单词结尾
int id;//单词的输入顺序
point(){ //初始化
istail =false;
fail = NULL;
memset(next,NULL,sizeof(next));
}
}*q[];//bfs 获得fail 用 struct pos{
int x,y,dis;
};
pos ans[];
point *root = NULL;
int l,c,w;
char map[][];//puzzle
char str[];//模版串
int len[];//记录每个摸版的长度
int tail,head;
int dix[][] = {-,,-,,,,,,,,,-,,-,-,-};//顺时针,,上下左右。。。八个方向
char res[]={"ABCDEFGH"};
void build_trie(char *str,int id){
point *p = root;
int i=,index;
while(str[i]){
index = str[i]-'A';
if(p->next[index]==NULL) p->next[index] = new point();
p = p->next[index];
i++;
}
p->istail = true;
p->id = id;
}
void get_ac(){
int i;
root->fail = NULL;
q[head++] = root;
while(head!=tail){
point *temp = q[tail++];
point *p =NULL;
for(i=;i<;i++){
if(temp->next[i]!=NULL){
if(temp==root) temp->next[i]->fail=root;
else{
p = temp->fail;
while(p!=NULL){
if(p->next[i]!=NULL){
temp->next[i]->fail = p->next[i];
break;
}
p = p->fail;
}
if(p==NULL) temp->next[i]->fail = root;
}
q[head++] = temp->next[i];
}
}
}
} void query(int x,int y,int i){
int index;
point *p,*qq;
p = root;
for(;map[x][y];x+=dix[i][],y+=dix[i][]){
index = map[x][y]-'A';
while(p->next[index]==NULL&&p!=root) p = p->fail;
p = p->next[index];
if(p==NULL)
p = root;
qq= p;
while(qq!=root){
if(qq->istail){
qq->istail = false;
ans[qq->id].x = x-dix[i][]*(len[qq->id]-)-;//从1开始记得数
ans[qq->id].y = y-dix[i][]*(len[qq->id]-);
ans[qq->id].dis = i;
}
qq = qq->fail;
}
}
}
int main()
{
root = new point();
cin>>l>>c>>w;
for(int i=;i<=l;i++)
cin>>map[i];
for(int i=;i<w;i++){
cin>>str;
len[i] = strlen(str);
build_trie(str,i);
}
head = tail =;
get_ac();
for(int i=;i<=l;i++){//枚举水平
query(i,,),query(i,,),query(i,,);//一行只需枚举开头和结尾即可,一列同样
query(i,c-,),query(i,c-,),query(i,c-,);
}
for(int i=;i<c;i++){//枚举竖直
query(,i,),query(,i,),query(,i,);
query(l,i,),query(l,i,),query(l,i,);
} for(int i=;i<w;i++){
cout<<ans[i].x<<" "<<ans[i].y<<" "<<res[ans[i].dis]<<endl;
}
return ;
}

poj 1204的更多相关文章

  1. poj 1204 Word Puzzles(字典树)

    题目链接:http://poj.org/problem?id=1204 思路分析:由于题目数据较弱,使用暴力搜索:对于所有查找的单词建立一棵字典树,在图中的每个坐标,往8个方向搜索查找即可: 需要注意 ...

  2. 【 POJ - 1204 Word Puzzles】(Trie+爆搜|AC自动机)

    Word Puzzles Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10782 Accepted: 4076 Special ...

  3. [POJ 1204]Word Puzzles(Trie树暴搜&amp;AC自己主动机)

    Description Word puzzles are usually simple and very entertaining for all ages. They are so entertai ...

  4. [poj] 1204 Word Puzzles || AC自动机

    原题 给个X*Y的字符串矩阵,W个询问,对每个询问输出这个串出现的位置及方向,共有8个方向,顺时针开始分别用A~H表示 AC自动机的板子题. 对于待匹配串建一个自动机,然后从矩阵的四周分别沿八个方向跑 ...

  5. POJ 1204 Word Puzzles | AC 自动鸡

    题目: 给一个字母矩阵和几个模式串,矩阵中的字符串可以有8个方向 输出每个模式串开头在矩阵中出现的坐标和这个串的方向 题解: 我们可以把模式串搞成AC自动机,然后枚举矩阵最外围一层的每个字母,向八个方 ...

  6. POJ 1204 Word Puzzles(AC自动机)

    这题的数据卡在,如下: 5 5 3 ABCDE FGHIJ KLMNO PQRST UVWXY PQR RS RST puzzle中间的行中可以包含要查询的多个单词.这个问题很好解决,SearchDf ...

  7. POJ题目分类(按初级\中级\高级等分类,有助于大家根据个人情况学习)

    本文来自:http://www.cppblog.com/snowshine09/archive/2011/08/02/152272.spx 多版本的POJ分类 流传最广的一种分类: 初期: 一.基本算 ...

  8. [转] POJ字符串分类

    POJ 1002 - 487-3279(基础)http://acm.pku.edu.cn/JudgeOnline/problem?id=1002题意:略解法:二叉查找数,map,快排... POJ 1 ...

  9. ACM 字符串 题目整理

    AC自动机 UVa 11468  Substring AC自动机+概率DP. 注意要补全不存在的边. 为什么要补全不存在的边呢?补全以后可以直接找到状态的转移,即从所有子节点就可以实现所有状态转移. ...

随机推荐

  1. C++读写EXCEL文件OLE,java读写excel文件POI 对比

    C++读写EXCEL文件方式比较 有些朋友问代码的问题,将OLE读写的代码分享在这个地方,大家请自己看.http://www.cnblogs.com/destim/p/5476915.html C++ ...

  2. 第一次当Uber司机,就拉到漂亮妹纸

    黑马哥的Uber司机端装上很久了,一次活儿也没拉,心里一直有一种当“张师傅”的冲动.黑马哥当Uber司机,肯定不是为了图挣钱,也不是因为Uber有“新约炮神器”的称号,能通过“拉活”来泡妹纸.黑马哥体 ...

  3. 原生javascript实现ajax,post参数

    var json = { userid: userid, cid: cid, openid: openid, type: 1 }; // 原生ajax json = (function(obj){ / ...

  4. c++11新特性(4) lambda捕捉块

    lambda表达式中的方括号成为捕捉块,能够在这里指定怎样从所在的作用域中捕捉变量. 捕捉的意思是指能够在该lambda中使用该变量.即能够捕获外部变量在lambda表达式内使用. 能够使用两种方式来 ...

  5. 【iOS知识学习】_如何判断手机是否为静音模式

    目前我涉及的app要获取系统是否为静音模式,到网上搜了一下,千篇一律的都是一样的,而且都是iOS5.0以前才适应的知识,这个大家去搜一下就会很容易发现,找了很久终于找到一个5.0以后适用的,那位大神的 ...

  6. objective-C学习笔记(八) 集合类型 Collection Types

    OBJC的集合类型: 1.数组 Array 2.Set 3.键值对 Dictionary 数组:OC中的数组被定义为class,引用类型.索引从0开始,访问越界会抛出运行时异常. NSArray的元素 ...

  7. ajax联动

    1.编写html代码,引入ajax文件 <script type="text/javascript" src="js/ajax.js"></s ...

  8. JSP 中动态 INCLUDE 与静态 INCLUDE 的区别?

    一.静态包含指令<%@include file="fileurl"%> 两个jsp页面的<%@page contentType="text/html:c ...

  9. xcode6编译cocos2dx项目出现Undefined symbols _fwrite$UNIX2003

    当xcode6编译cocos2dx的时候会出现Undefined symbols _fwrite$UNIX2003 这个问题.google了一篇文章:http://stackoverflow.com/ ...

  10. virtualbox 中安装win7虚拟机

    下载了win7镜像文件后,在virtualbox中装了几次都提示 windows faied to start,后来在网上找了些解决办法,在这记录下,免得下次又忘了 创建新的虚拟机: 1.安装virt ...