刷的第二题AC自动机,这题简直了。。

用询问的串建AC自动机,然后。。。爆搜!

ACBB                  ACBB
ACCA                  A  A
ABBC        ——〉     A  C
ACBA                  ACBA

像这样,将最外面的每一个点将有可能的方向走,比如第一行第一列的A向东南走,就可以得到一个ACBA的串,然后像模板题一样,去匹配找就行了。(老实讲我还是觉得这个很不靠谱。。谁叫人家地图小。。)

小细节,我将查询的字符串反着建ACM了,假设要找ACBA,那我就把它变成ABCA,有什么好处呢?就是找这个串时,我们从最下面的A一路往上,找到最上面的A,这样就可以直接找到起始点了。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int dx[]={-,-,,,,,,-};
const int dy[]={,,,,,-,-,-};
struct Trie
{
bool b;
int s,w[],fail;
}tr[];int trlen;
int a[],len;
void clean(int x)
{
tr[x].s=;tr[x].b=false;tr[x].fail=;
memset(tr[x].w,,sizeof(tr[x].w));
}
void bt(int id)
{
int now=;
for(int i=;i<=len;i++)
{
int x=a[i];
if(tr[now].w[x]==)
{
tr[now].w[x]=++trlen;
clean(trlen);
}
now=tr[now].w[x];
}
tr[now].s=id;
}
int list[];
void bfs()
{
int head=,tail=;list[]=;
while(head!=tail)
{
int now=list[head];
for(int x=;x<=;x++)
{
int son=tr[now].w[x];
if(son==)continue;
if(now==)tr[son].fail=;
else
{
int p=tr[now].fail;
while(p!=&&tr[p].w[x]==)p=tr[p].fail;
tr[son].fail=max(tr[p].w[x],);
}
list[tail]=son;
tail++;if(tail==)tail=;
}
head++;if(head==)head=;
}
}
int n,m,T;
char mp[][],ss[];
struct Ans
{
int x,y,c;
}ans[];
void Find(int x,int y,int i)
{
int now=;
while(x>=&&y>=&&x<n&&y<m)
{
int j=mp[x][y]-'A'+;
while(now!=&&tr[now].w[j]==)now=tr[now].fail;
now=tr[now].w[j];
for(int k=now;k;k=tr[k].fail)
{
if(tr[k].b==false)
{
if(tr[k].s!=)
{
ans[tr[k].s].x=x;
ans[tr[k].s].y=y;
ans[tr[k].s].c=(i+)%;
}
tr[k].b=;
}
}
x+=dx[i];y+=dy[i];
}
}
int main()
{
scanf("%d%d%d",&n,&m,&T);
trlen=;clean();
for(int i=;i<n;i++)scanf("%s",mp[i]);
for(int i=;i<=T;i++)
{
scanf("%s",ss+);len=strlen(ss+);
for(int j=;j<=len;j++)a[j]=ss[len-j+]-'A'+;
bt(i);
}
bfs();
Find(,,);
Find(,m-,);
Find(n-,,);Find(n-,m-,);
for(int j=;j<m;j++)
{
Find(,j,);Find(,j,);Find(,j,);
Find(n-,j,);Find(n-,j,);Find(n-,j,);
}
Find(,,);Find(n-,,);
Find(,m-,);Find(n-,m-,);
for(int i=;i<n;i++)
{
Find(i,,);Find(i,,);Find(i,,);
Find(i,m-,);Find(i,m-,);Find(i,m-,);
}
for(int i=;i<=T;i++)
printf("%d %d %c\n",ans[i].x,ans[i].y,ans[i].c+'A');
return ;
}

caioj1465&&poj1024: 【AC自动机】地图匹配的更多相关文章

  1. hdu 3695:Computer Virus on Planet Pandora(AC自动机,入门题)

    Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 256000/1280 ...

  2. [知识点]Trie树和AC自动机

    // 此博文为迁移而来,写于2015年5月27日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w1s8.html 1.前 ...

  3. HDU-4534 郑厂长系列故事——新闻净化 AC自动机+DP

    题意:给定一些单词,这些单词必须要是一个目标串的子串,同时给定一些串,这些串不能够出现在目标串中,其余一些串只会带来不同附加值.现在问满足前两者的情况下,要求附加值最大.数据给定一个原始串,现在要求在 ...

  4. AC自动机基础知识讲解

    AC自动机 转载自:小白 还可参考:飘过的小牛 1.KMP算法: a. 传统字符串的匹配和KMP: 对于字符串S = ”abcabcabdabba”,T = ”abcabd”,如果用T去匹配S下划线部 ...

  5. 【hdu3247-Resource Archiver】位压DP+AC自动机+SPFA

    题意:给定n个文本串,m个病毒串,文本串重叠部分可以合并,但合并后不能含有病毒串,问所有文本串合并后最短多长. (2 <= n <= 10, 1 <= m <= 1000) 题 ...

  6. hdoj 3065 病毒侵袭持续中(AC自动机)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3065 思路分析:问题需要模式匹配多个模式串,需要注意的是模式串会包含和重叠,需要对AC自动机的匹配过 ...

  7. poj_2778_DNA Sequence(AC自动机+矩阵)

    题目链接:poj_2778_DNA Sequence 题意: 有m个模式串,然后给你一个长度n,问你n长度的DNA序列有多少种不包含这m个模式串 题解: 这题显然要用AC自动机,将模式串的AC自动机建 ...

  8. hdu_2457_DNA repair(AC自动机+DP)

    题目连接:hdu_2457_DNA repair 题意: 给你N个字符串,最后再给你一个要匹配的串,问你最少修改多少次,使得这个串不出现之前给的N的字符串 题解: 刚学AC自动机,切这题还真不知道怎么 ...

  9. AC自动机算法小结

    AC自动机,可惜不能自动AC 转载:飘过的小牛 OIer55242 简介 Aho-Corasick automation 该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一.一个常见的例子就 ...

  10. Aho-Corasick automaton(AC自动机)解析及其在算法竞赛中的典型应用举例

    摘要: 本文主要讲述了AC自动机的基本思想和实现原理,如何构造AC自动机,着重讲解AC自动机在算法竞赛中的一些典型应用. 什么是AC自动机? 如何构造一个AC自动机? AC自动机在算法竞赛中的典型应用 ...

随机推荐

  1. hdu5396 Expression

    Expression Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  2. 洛谷 P 1164 小A点菜

    题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过uim由于买了一些辅(e ...

  3. R语言入门视频笔记--1

    一.数据框简要 可输入来访问mtcars这个系统自带的数据框中的mpg列 mtcars$mpg 或者输入 mtcars[c("mpg","cyl")] 来访问两 ...

  4. Laravel 之Artisan

    简介: Artisan是Laravel中自带的命令行工具的名称: 由强大的Symfony Console组件驱动的: 提供了一些对应用开发有帮助的命令: 查看所有可用的Artisan的命令 php a ...

  5. 小程序-地图API

    摘要 地图组件-map 注意事项&&Bug: 1.map 组件是由客服端创建的原生组件,它的层级是最高的. 2.请勿在scroll-view中使用map组件 3.css动画对map组件 ...

  6. Codeforces 864E Fire(DP)

    题目链接 Fire 题意 有n个物品,每个物品的挽救时间代价为ti, 消失时刻为di, 价值为pi. 如果要救某个物品,必须在他消失之前救出来. 同一时刻最多只能救一件物品. 当前耗时为当前已经救出的 ...

  7. Easy sssp(spfa)(负环)

    vijos    1053    Easy sssp 方法:用spfa判断是否存在负环 描述 输入数据给出一个有N(2 <= N <= 1,000)个节点,M(M <= 100,00 ...

  8. 树莓派学习笔记——I2C设备载入和速率设置

    原文:http://blog.csdn.net/xukai871105/article/details/18234075 1.载入设备 方法1——临时载入设备 sudo modprobe -r i2c ...

  9. json常见用法-loads、jumps、load、jump

    这一篇博客的目的主要是想说明一个问题:干什么事情要抓住重点,不要力求完美,不要追求那种'大而全'的办事方式,因为时间是有限的,而客观事物(这里主要指技术方面的知识)是无限的,so,anyway! 1. ...

  10. noip2015提高组day2解题报告

    1.跳石头 题目描述 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石( ...