题目:

给一个字母矩阵和几个模式串,矩阵中的字符串可以有8个方向

输出每个模式串开头在矩阵中出现的坐标和这个串的方向


题解:

我们可以把模式串搞成AC自动机,然后枚举矩阵最外围一层的每个字母,向八个方向进行匹配

代码中danger标记为判断这个节点是不是一个模式串的结尾,

这道题可以直接字符串反向构建AC自动机,匹配到的就是开头(代码是正向)

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define Z 27
#define N 1010
using namespace std;
struct node
{
int trans[Z],fail,danger;
void init()
{
memset(trans,0,sizeof(trans));
danger=fail=0;
}
}tr[1000010];
char puzzle[N][N],s[N],dir[10]={'A','B','C','D','E','F','G','H'};
int l,c,w,dx[10]={-1,-1,0,1,1,1,0,-1},dy[10]={0,1,1,1,0,-1,-1,-1};
int fa[N],ansx[N],ansy[N],tot=1,len[N],d[N]; int find(int x)
{
return fa[x]=fa[x]==x?x:find(fa[x]);
} void insert(char s[],int id)
{
int len=strlen(s+1),now=1;
for (int i=1;i<=len;i++)
{
if (tr[now].trans[s[i]-'A']==0)
tr[tr[now].trans[s[i]-'A']=++tot].init();
now=tr[now].trans[s[i]-'A'];
}
if (tr[now].danger)
fa[find(id)]=find(tr[now].danger);
else
tr[now].danger=id;
} void BuildFail()
{
queue <int> q;
tr[1].fail=1;
for (int i=0;i<26;i++)
{
if (tr[1].trans[i]==0)
tr[1].trans[i]=1;
else
{
tr[tr[1].trans[i]].fail=1;
q.push(tr[1].trans[i]);
}
}
while (!q.empty())
{
int u=q.front(),v,w;
for (int i=0;i<26;i++)
{
v=tr[u].fail;
v=tr[v].trans[i],w=tr[u].trans[i];
if (w) tr[w].fail=v,q.push(w);
else tr[u].trans[i]=v;
}
q.pop();
if (tr[u].danger==0 && tr[tr[u].fail].danger)
tr[u].danger=tr[tr[u].fail].danger;
}
} void query(int x,int y,int t)
{
int p=1;
while (x>0 && y>0 && x<=l && y<=c)
{
p=tr[p].trans[puzzle[x][y]-'A'];
int ap=p;
while (tr[ap].danger)
{
int k=tr[ap].danger;
ansx[k]=x-dx[t]*(len[k]-1);
ansy[k]=y-dy[t]*(len[k]-1);
d[k]=t;
ap=tr[ap].fail;
}
x+=dx[t];
y+=dy[t];
}
} int main()
{
scanf("%d%d%d",&l,&c,&w);
for (int i=1;i<=l;i++)
scanf("%s",puzzle[i]+1);
for (int i=1;i<=w;i++)
{
scanf("%s",s+1);
fa[i]=i;
len[i]=strlen(s+1);
insert(s,i);
}
BuildFail();
for (int i=1;i<=l;i++)
for (int j=0;j<8;j++)
query(i,1,j),query(i,c,j);
for (int i=1;i<=c;i++)
for (int j=0;j<8;j++)
query(1,i,j),query(l,i,j);
for (int i=1;i<=w;i++)
printf("%d %d %c\n",ansx[i]-1,ansy[i]-1,dir[d[i]]);
return 0;
}

POJ 1204 Word Puzzles | AC 自动鸡的更多相关文章

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

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

  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自动机)

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

  5. poj 1204 Word Puzzles(字典树)

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

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

    题目大意:原题链接 给定一个字符串矩阵和待查找的单词,可以朝8个不同的方向查找,输出待查找单词第一个字母在矩阵中出现的位置和该单词被查到的方向. A~H代表8个不同的方向,A代表正北方向,其他依次以4 ...

  7. POJ 题目1204 Word Puzzles(AC自己主动机,多个方向查询)

    Word Puzzles Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 10244   Accepted: 3864   S ...

  8. pku1204 Word Puzzles AC自动机 二维字符串矩阵8个方向找模式串的起点坐标以及方向 挺好的!

    /** 题目:pku1204 Word Puzzles 链接:http://poj.org/problem?id=1204 题意:给定一个L C(C <= 1000, L <= 1000) ...

  9. POJ 2778 DNA Sequence (矩阵快速幂 + AC自动鸡)

    题目:传送门 题意: 给你m个病毒串,只由(A.G.T.C) 组成, 问你生成一个长度为 n 的 只由 A.C.T.G 构成的,不包含病毒串的序列的方案数. 解: 对 m 个病毒串,建 AC 自动机, ...

随机推荐

  1. web攻击技术与防护

    一.跨站脚本攻击(XSS) 跨站脚本攻击是指通过存在安全漏洞的Web网站注册用户的浏览器运行非法的HTML标签或JavaScript进行的一种攻击.动态创建的HTML部分有可能隐藏着安全漏洞.就这样, ...

  2. 面向对象封装的web服务器

    import socket import re import os import sys # 由于前面太繁琐,可以用类封装一下,也可以分几个模块 class HttpServer(object): d ...

  3. Zeppelin interperter 模式设置总结图解1

    如有错漏,望请指正,不胜感激. 参考:[zeppelin官网]:https://zeppelin.apache.org/docs/latest/interpreter/spark.html#inter ...

  4. ubuntu修改IP地址和网关的方法

    一.使用命令设置Ubuntu IP地址 1.修改配置文件blacklist.conf禁用IPV6 sudo vi /etc/modprobe.d/blacklist.conf 表示用vi编辑器(也可以 ...

  5. Python类与对象--基础

    ## 类 - 具体事物的抽象和总结,是事物的共性,由属性和方法两个部分构成,比如一个Person类,有是身高.体重.肤色等属性,也有吃饭.睡觉.观察.等方法 ## 对象 - 具体的事物,单一.个体.特 ...

  6. pageScope、requestScope、sessionScope、applicationScope的区别

    https://www.cnblogs.com/qianbaidu/p/6006459.html 1.区别: 1.page指当前页面有效.在一个jsp页面里有效 2.request 指在一次请求的全过 ...

  7. Python入门必学:数据类型和变量的用法

    什么是数据类型?计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据,不同的数据, ...

  8. python的运行过程剖析·编程语言分类

    总结: 编程语言的分类 编译型: 说明:与汇编语言类似,都有一个编译程序将源代码编译成硬件可执行的二进制代码 特点:执行速度快.同等情况下对系统要求低,适合于开发大型应用程序.数据库系统.操作系统等 ...

  9. 代理缓存服务之Squid

    代理缓存服务 Squid是linux系统中最为流行的一款高性能代理服务软件,通常用作Web网站的前置缓存服务,能够代替用户向网站服务器请求页面数据并进行缓存. 简单来说,Squid服务程序会按照收到的 ...

  10. P3818 小A和uim之大逃离 II(洛谷月赛)

    P3818 小A和uim之大逃离 II 题目背景 话说上回……还是参见 https://www.luogu.org/problem/show?pid=1373 吧 小a和uim再次来到雨林中探险.突然 ...