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. POJ 3450 Corporate Identity(KMP)

    [题目链接] http://poj.org/problem?id=3450 [题目大意] 求k个字符串的最长公共子串,如果有多个答案,则输出字典序最小的. [题解] 我们对第一个串的每一个后缀和其余所 ...

  2. Noip2013心态调整

    决定成绩的,很多时候可能不是实力,而是心态,一年走来,承受着一次次失败,怀疑,背负着希望与压力,突然发现,只有拥有过,失去过,才可以真正去超越,我希望完成我的梦想,但是唯有放下梦想,才可以走向它. 心 ...

  3. 【Perl学习笔记】2. perl中的bless理解

    bless有两个参数:对象的引用.类的名称. 类的名称是一个字符串,代表了类的类型信息,这是理解bless的关键. 所谓bless就是把 类型信息 赋予 实例变量. 程序包括5个文件:person.p ...

  4. 第七届河南省赛F.Turing equation(模拟)

    10399: F.Turing equation Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 151  Solved: 84 [Submit][St ...

  5. Candy----HDU4465----数学题

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4465 题目意思: 有两个箱子,每个箱子装有N个糖果 打开第一个箱子的概率是P,另外一个就是1-P 当小 ...

  6. 百度 LBS 开放平台,开发人员众測计划正式启动

    Hi各位亲爱滴开发人员:   你是否以前-- 期望第一时间率先接触到百度LBS开放平台的最新功能? 期望被邀请作为最最尊贵的首批试用志愿者感受志愿者的特权? 期望自己的意见被产品经理採纳.优化功能.从 ...

  7. JavaScript 实现Map

    var map=new Map(); map.put("a","A");map.put("b","B");map.put ...

  8. tlplayer for ios V1.0

    此程序UI修改于虎跃在线课堂.所以极其相似. 可以播放网络视频与本地视频,不知道怎么拷贝本地视频到Ipad或iphone上看的朋友,请自己到网上看教程. 支持mms,file,rtsp,rtmp,ht ...

  9. Hadoop-04-HBase全然分布式环境搭建

    Hbase分布式具体安装步骤 Hadoop全然分布式环境已经搭建完毕(參见01_Hadoop全然分布式环境搭建). 注意:Hbase和Hadoop的版本号必须相应! 不然会出现各种问题! 这里选用的是 ...

  10. BootStrap 智能表单系列 六 表单数据绑定(编辑页面的数据绑定)

    本章介绍如何在生成表单后,将一个model的数据展示到form表单中(一般用于编辑页面) 代码如下(连接地址:https://github.com/xiexingen/Bootstrap-SmartF ...