POJ 1204 Word Puzzles | AC 自动鸡
题目:
给一个字母矩阵和几个模式串,矩阵中的字符串可以有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 自动鸡的更多相关文章
- [poj] 1204 Word Puzzles || AC自动机
原题 给个X*Y的字符串矩阵,W个询问,对每个询问输出这个串出现的位置及方向,共有8个方向,顺时针开始分别用A~H表示 AC自动机的板子题. 对于待匹配串建一个自动机,然后从矩阵的四周分别沿八个方向跑 ...
- 【 POJ - 1204 Word Puzzles】(Trie+爆搜|AC自动机)
Word Puzzles Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10782 Accepted: 4076 Special ...
- [POJ 1204]Word Puzzles(Trie树暴搜&AC自己主动机)
Description Word puzzles are usually simple and very entertaining for all ages. They are so entertai ...
- POJ 1204 Word Puzzles(AC自动机)
这题的数据卡在,如下: 5 5 3 ABCDE FGHIJ KLMNO PQRST UVWXY PQR RS RST puzzle中间的行中可以包含要查询的多个单词.这个问题很好解决,SearchDf ...
- poj 1204 Word Puzzles(字典树)
题目链接:http://poj.org/problem?id=1204 思路分析:由于题目数据较弱,使用暴力搜索:对于所有查找的单词建立一棵字典树,在图中的每个坐标,往8个方向搜索查找即可: 需要注意 ...
- PKU 1204 Word Puzzles(AC自动机)
题目大意:原题链接 给定一个字符串矩阵和待查找的单词,可以朝8个不同的方向查找,输出待查找单词第一个字母在矩阵中出现的位置和该单词被查到的方向. A~H代表8个不同的方向,A代表正北方向,其他依次以4 ...
- POJ 题目1204 Word Puzzles(AC自己主动机,多个方向查询)
Word Puzzles Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10244 Accepted: 3864 S ...
- pku1204 Word Puzzles AC自动机 二维字符串矩阵8个方向找模式串的起点坐标以及方向 挺好的!
/** 题目:pku1204 Word Puzzles 链接:http://poj.org/problem?id=1204 题意:给定一个L C(C <= 1000, L <= 1000) ...
- POJ 2778 DNA Sequence (矩阵快速幂 + AC自动鸡)
题目:传送门 题意: 给你m个病毒串,只由(A.G.T.C) 组成, 问你生成一个长度为 n 的 只由 A.C.T.G 构成的,不包含病毒串的序列的方案数. 解: 对 m 个病毒串,建 AC 自动机, ...
随机推荐
- oracle数据库 网页管理360浏览器登录不上
使用谷歌浏览器可以登陆,然后在使用360之类的浏览器 就可以登录了
- Spring 中IOC(控制反转)&& 通过SET方式为属性注入值 && Spring表达式
### 1. Spring IoC IoC:Inversion of control:控制反转:在传统开发模式下,对象的创建过程和管理过程都是由开发者通过Java程序来实现的,操作权在开发者的Java ...
- Intellij IDEA 像eclipse那样给maven添加依赖,且Intellij idea里在pom.xml里添加Maven依赖,本地仓库下拉列表显示包很少的血的经验
打开pom.xml,在它里面使用快捷键:ALT+Insert ————>点击dependency 再输入想要添加的依赖关键字,比如:输个spring 出现下图: 根据需求选择版本,完成以后 ...
- 浅谈PHP中的数组和JS中的数组
最近在做前后端对接的时候,遇到一个问题,前端要求返回的数据格式是左边的,但是我通过json_encode返回到的数据格式是右边的 注意:数据格式从"[]"(数组)变成了&quo ...
- 10.1.2 Document类型【JavaScript高级程序设计第三版】
JavaScript 通过Document 类型表示文档.在浏览器中,document 对象是HTMLDocument(继承自Document 类型)的一个实例,表示整个HTML 页面.而且,docu ...
- c++ function和bind
bind 定义在头文件 functional 里 template<typename _Func, typename... _BoundArgs> inline typename _Bin ...
- git rebase -i
git rebase -i 作用: 合并提交 示例: 如图所示: 原因: 出现了两个第十一章的提交信息, 其实提交内容是一样的, 但是提交概述不一样. 这就让我很不爽. 我想把两次的概述信息合并为一个 ...
- Spring---加载配置文件的几种方法(org.springframework.beans.factory.BeanDefinitionStoreException)
Spring中的几种容器都支持使用xml装配bean,包括:XmlBeanFactory ,ClassPathXmlApplicationContext ,FileSystemXmlApplicati ...
- 10 class封装 ORM
1.版本1:初始化 # -*- coding:utf-8 -*- from MySQLdb import * class MysqlHelper: def __init__(self,host,por ...
- mysql 中的基本用法,以及日期的转换
1.mysql int(10) int 类型长度4个字节,大约表示2^32数字,10代表的是显示长度,一般和FILLZERO约束一起使用,如果没有达到该长度,填充02-->000000002 m ...