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 自动机, ...
随机推荐
- 易语言调用C++写的DLL
直接调用会弹出堆栈错误的信息,原因是VS默认是__cdcel方式,而易语言是__stdcall,所以调用约定不一致导致堆栈错误. 解决方案很简单,易语言声明DLL函数时“在库中对应命令名”函数名前加一 ...
- python核心编程2 第六章 练习
6-2. 字符串标识符.修改例 6-1 的 idcheck.py 脚本,使之可以检测长度为一的标识符,并且可以识别 Python 关键字,对后一个要求,你可以使用 keyword 模块(特别是 key ...
- php学习【2】
1:运算符 <?php $x=1; echo 1+1;//算术运算符 echo $x+=5;//赋值运算符 echo "<br/>"; echo $x++; ec ...
- linux最大进程数
使用 ulimit -a 命令,查看 max user processes 的输出,就是系统最大进程数 core file size (blocks, -c) unlimited data seg s ...
- 裸机——ADC
1.首先是ADC的基本知识 模拟信号,连续的 数字信号,离散的 模拟信号,现实世界的很多东西都是连续的,所以使用模拟信号才能准确描述,但是模拟信号不方便控制. 数字信号,计算机中的信号大都为数字的,数 ...
- Cache、Buffer的区别
什么是Cache?什么是Buffer?二者的区别是什么? Buffer和Cache的区别 buffer与cache操作的对象就不一样. 1.buffer(缓冲)是为了提高内存和硬盘(或其他I/O设备) ...
- 15.5,centos下redis安全相关
博文背景: 由于发现众多同学,在使用云服务器时,安装的redis3.0+版本都关闭了protected-mode,因而都遭遇了挖矿病毒的攻击,使得服务器99%的占用率!! 因此我们在使用redis ...
- CodeForces 873F Forbidden Indices 后缀数组
忘了当时怎么做的了,先把代码贴上,保存一下后缀数组模板. #include <cstdio> #include <cstring> #include <algorithm ...
- json对象和java对象的相互转换方法(json-lib、jackson、fastjson、gson)
一 使用json-lib包下的JSONObject和JSONArray转换 代码如下: package com.test.test; import java.util.ArrayList; impor ...
- 《Cracking the Coding Interview》——第6章:智力题——题目5
2014-03-20 01:08 题目:扔鸡蛋问题.有一个鸡蛋,如果从N楼扔下去恰好会摔碎,低于N楼则不碎,可以继续扔.给你两个这样的鸡蛋,要求你一定得求出N,怎么扔才能减少最坏情况下的扔的次数? 解 ...