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自动机在算法竞赛中的典型应用 ...
随机推荐
- leetcode 94 中序遍历模板
/**递归的写法 * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * Tre ...
- 窗口(codevs 4373)
题目描述 Description 给你一个长度为N的数组,一个长为K的滑动的窗体从最左移至最右端,你只能见到窗口的K个数,每次窗体向右移动一位,如下表: Window position Min val ...
- float类型的使用
将身高字段设置为float类型,保留一位小数: ALTER TABLE `user` CHANGE `height` `height` FLOAT(4,1) UNSIGNED NOT NULL DEF ...
- 一个强大的Android模拟器Genymotion
相信很多Android开发者一定受够了速度慢.体验差效率及其地下的官方模拟器了,自己在平时的开发中几乎是不会用模拟器的,等的时间太久了,但是在一些尺寸适配或是兼容性测试的时候没有足够多的机器进行测试, ...
- (44)C#网络2
一.用SmtpClient类发送邮件 允许应用程序使用简单邮件传输协议 (SMTP) 发送电子邮件 using System.Net.Mail; SmtpClient smtpClient = new ...
- 42.QT-QSqlQuery类操作SQLite数据库(创建、查询、删除、修改)详解
Qt 提供了 QtSql 模块来提供平台独立的基于 SQL 的数据库操作.这里我们所说的“平台 独立”,既包括操作系统平台,也包括各个数据库平台,Qt支持以下几种数据库: QT自带SQLITE数据库, ...
- [bzoj3709][PA2014]Bohater_贪心
bzoj-3709 PA-2014 Bohater 题目大意:在一款电脑游戏中,你需要打败n只怪物(从1到n编号).为了打败第i只怪物,你需要消耗d[i]点生命值,但怪物死后会掉落血药,使你恢复a[i ...
- TeX系列: tikz-3dplot绘图宏包
tikz-3dplot包提供了针对TikZ的命令和坐标变换样式, 能够相对直接地绘制三维坐标系统和简单三维图形. tikz-3dplot包当前处于初创期, 有很多功能有待完善. 安装过程如下: (1) ...
- PHP拓展开发
痛定思痛: 开始了解 PHP 拓展开发,下面这篇文章不错!照着文章讲的,终于实现了! m.php的代码 浏览器访问 m.php 文件!(备注:在linux 命令行中 php -r 'cthulhu() ...
- 转:一个android开发者独立开发社交app全过程
http://www.cnblogs.com/linguanh/p/5683069.html