caioj1465&&poj1024: 【AC自动机】地图匹配
刷的第二题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自动机】地图匹配的更多相关文章
- hdu 3695:Computer Virus on Planet Pandora(AC自动机,入门题)
Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 256000/1280 ...
- [知识点]Trie树和AC自动机
// 此博文为迁移而来,写于2015年5月27日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w1s8.html 1.前 ...
- HDU-4534 郑厂长系列故事——新闻净化 AC自动机+DP
题意:给定一些单词,这些单词必须要是一个目标串的子串,同时给定一些串,这些串不能够出现在目标串中,其余一些串只会带来不同附加值.现在问满足前两者的情况下,要求附加值最大.数据给定一个原始串,现在要求在 ...
- AC自动机基础知识讲解
AC自动机 转载自:小白 还可参考:飘过的小牛 1.KMP算法: a. 传统字符串的匹配和KMP: 对于字符串S = ”abcabcabdabba”,T = ”abcabd”,如果用T去匹配S下划线部 ...
- 【hdu3247-Resource Archiver】位压DP+AC自动机+SPFA
题意:给定n个文本串,m个病毒串,文本串重叠部分可以合并,但合并后不能含有病毒串,问所有文本串合并后最短多长. (2 <= n <= 10, 1 <= m <= 1000) 题 ...
- hdoj 3065 病毒侵袭持续中(AC自动机)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3065 思路分析:问题需要模式匹配多个模式串,需要注意的是模式串会包含和重叠,需要对AC自动机的匹配过 ...
- poj_2778_DNA Sequence(AC自动机+矩阵)
题目链接:poj_2778_DNA Sequence 题意: 有m个模式串,然后给你一个长度n,问你n长度的DNA序列有多少种不包含这m个模式串 题解: 这题显然要用AC自动机,将模式串的AC自动机建 ...
- hdu_2457_DNA repair(AC自动机+DP)
题目连接:hdu_2457_DNA repair 题意: 给你N个字符串,最后再给你一个要匹配的串,问你最少修改多少次,使得这个串不出现之前给的N的字符串 题解: 刚学AC自动机,切这题还真不知道怎么 ...
- AC自动机算法小结
AC自动机,可惜不能自动AC 转载:飘过的小牛 OIer55242 简介 Aho-Corasick automation 该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一.一个常见的例子就 ...
- Aho-Corasick automaton(AC自动机)解析及其在算法竞赛中的典型应用举例
摘要: 本文主要讲述了AC自动机的基本思想和实现原理,如何构造AC自动机,着重讲解AC自动机在算法竞赛中的一些典型应用. 什么是AC自动机? 如何构造一个AC自动机? AC自动机在算法竞赛中的典型应用 ...
随机推荐
- SQLite数据库相关操作
一.创建数据库 这里创建了note便签数据表,字段有noteId.noteTitle.noteTime.noteInfo ); // TODO Auto-generated constructor ...
- msp430项目编程60
msp430综合项目---扩展项目八60 1.电路工作原理 2.代码(显示部分) 3.代码(功能实现) 4.项目总结
- Python爬虫--beautifulsoup 4 用法
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构, 每个节点都是Python对象,所有对象可以归纳为4种: Tag , NavigableString , BeautifulSo ...
- centos升级glibc(升级到 2.17版)
https://blog.csdn.net/wyl9527/article/details/78256066
- Maven项目配置外部依赖(本地依赖)
加入有一些公共jar包只限于公司内部使用,不能暴露在外部时,有如下的方案: 1.搭建私有远程仓库(nexus) 2.使用http.ftp.共享地址,github地址等(主要是通过maven-deplo ...
- Linux下文件操作命令cat(转)
语法格式: cat [-AbeEnstTuv] [--help] [--version] fileName 参数说明: -n 或 --number:由 1 开始对所有输出的行数编号. -b 或 --n ...
- 前端高频面试题 CSS篇
通过从网上看到的面经,总结的一些高频的前端CSS面试题,有很多不会,于是找资料,并通过代码实现,自己提供了一些参考答案. 目录 1.怎样会产生浮动? 2.如何清除浮动? 3.盒子模型,以及IE和其他浏 ...
- Centos 6.x 安装Python 3.4.3
[root@squid ~]# sed -i 's#keepcache=0#keepcache=1#g' /etc/yum.conf [root@squid ~]# grep keepcache /e ...
- android_checkbox_dialog 设计 是不是要开起 默认不提示对话框
android_checkbox_dialog设计是不是开起默认不提示 package com.example.android_checkbox_dialog; import android.app. ...
- csu1116 Kingdoms 最小生成树-枚举状态
题目链接: csu 1116 题意: 有一幅双向图连接N个城市(标号1~n,1表示首都) 每一个城市有一个价值W. 地震摧毁了全部道路,现给出可修复的m条道路并给出修复每条道路所需的费用 问在总费用 ...