原题

给个X*Y的字符串矩阵,W个询问,对每个询问输出这个串出现的位置及方向,共有8个方向,顺时针开始分别用A~H表示

AC自动机的板子题。

对于待匹配串建一个自动机,然后从矩阵的四周分别沿八个方向跑,找到一个串的时候就记录答案,但不能退出。

另:方向要找好啊!!

#include<cstdio>
#include<cstring>
#define N 1010
using namespace std;
int x,y,n,ansx[N],ansy[N],d[N],l[N];
//int dx[10]={0,0,1,1,1,0,-1,-1,-1},dy[10]={0,1,1,0,-1,-1,-1,0,1};
int dx[10]={0,-1,-1,0,1,1,1,0,-1},dy[10]={0,0,1,1,1,0,-1,-1,-1};
char t[N][N],s[N],r[10]=" ABCDEFGH";
struct hhh
{
int data;
hhh *child[26],*fail;
hhh()
{
fail=NULL;
data=0;
for (int i=0;i<26;i++) child[i]=NULL;
}
};
hhh *root=new hhh;
hhh *now,*tmp;
hhh* q[100*1000+10]; void add(int x)
{
now=root;
for (int i=1;i<=l[x];i++)
{
if (now->child[s[i]-'A']==NULL)
now->child[s[i]-'A']=new hhh;
now=now->child[s[i]-'A'];
}
now->data=x;
} void bfs()
{
int l=0,r=0;
root->fail=root;
for (int i=0;i<26;i++)
{
if (root->child[i]==NULL)
root->child[i]=root;
else
root->child[i]->fail=root,q[r++]=(root->child[i]);
}
while (r!=l)
{
hhh* nw=q[l++];
for (int i=0;i<26;i++)
{
if (nw->child[i])
{
now=nw->child[i];
if (now!=root) q[r++]=now;
if (now->fail==NULL) now->fail=nw->fail->child[i];
}
else nw->child[i]=nw->fail->child[i];
if (nw->data==0 && nw->fail->data)
nw->data=nw->fail->data;
}
}
} void find(int a,int b,int i)
{
now=root;
while (1)
{
if (a<=0 || a>x) break;
if (b<=0 || b>y) break;
now=now->child[t[a][b]-'A'];
tmp=now;
while (tmp->data)
{
int tp=tmp->data;
ansx[tp]=a-dx[i]*(l[tp]-1);
ansy[tp]=b-dy[i]*(l[tp]-1);
d[tp]=i;
tmp=tmp->fail;
}
a+=dx[i];
b+=dy[i];
}
} int main()
{
scanf("%d%d%d",&x,&y,&n);
for (int i=1;i<=x;i++)
scanf("%s",t[i]+1);
for (int i=1;i<=n;i++)
{
scanf("%s",s+1);
l[i]=strlen(s+1);
add(i);
}
bfs();
for (int i=1;i<=8;i++)
{
for (int j=1;j<=x;j++)
{
find(j,1,i);
find(j,y,i);
}
for (int j=1;j<=y;j++)
{
find(1,j,i);
find(x,j,i);
}
}
for (int i=1;i<=n;i++)
printf("%d %d %c\n",ansx[i]-1,ansy[i]-1,r[d[i]]);
return 0;
}

[poj] 1204 Word Puzzles || AC自动机的更多相关文章

  1. PKU 1204 Word Puzzles(AC自动机)

    题目大意:原题链接 给定一个字符串矩阵和待查找的单词,可以朝8个不同的方向查找,输出待查找单词第一个字母在矩阵中出现的位置和该单词被查到的方向. A~H代表8个不同的方向,A代表正北方向,其他依次以4 ...

  2. POJ 1204 Word Puzzles | AC 自动鸡

    题目: 给一个字母矩阵和几个模式串,矩阵中的字符串可以有8个方向 输出每个模式串开头在矩阵中出现的坐标和这个串的方向 题解: 我们可以把模式串搞成AC自动机,然后枚举矩阵最外围一层的每个字母,向八个方 ...

  3. 【 POJ - 1204 Word Puzzles】(Trie+爆搜|AC自动机)

    Word Puzzles Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10782 Accepted: 4076 Special ...

  4. [POJ 1204]Word Puzzles(Trie树暴搜&amp;AC自己主动机)

    Description Word puzzles are usually simple and very entertaining for all ages. They are so entertai ...

  5. pku1204 Word Puzzles AC自动机 二维字符串矩阵8个方向找模式串的起点坐标以及方向 挺好的!

    /** 题目:pku1204 Word Puzzles 链接:http://poj.org/problem?id=1204 题意:给定一个L C(C <= 1000, L <= 1000) ...

  6. POJ 1204 Word Puzzles(AC自动机)

    这题的数据卡在,如下: 5 5 3 ABCDE FGHIJ KLMNO PQRST UVWXY PQR RS RST puzzle中间的行中可以包含要查询的多个单词.这个问题很好解决,SearchDf ...

  7. poj 1204 Word Puzzles(字典树)

    题目链接:http://poj.org/problem?id=1204 思路分析:由于题目数据较弱,使用暴力搜索:对于所有查找的单词建立一棵字典树,在图中的每个坐标,往8个方向搜索查找即可: 需要注意 ...

  8. POJ 题目1204 Word Puzzles(AC自己主动机,多个方向查询)

    Word Puzzles Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 10244   Accepted: 3864   S ...

  9. poj 2778 DNA Sequence ac自动机+矩阵快速幂

    链接:http://poj.org/problem?id=2778 题意:给定不超过10串,每串长度不超过10的灾难基因:问在之后给定的长度不超过2e9的基因长度中不包含灾难基因的基因有多少中? DN ...

随机推荐

  1. Python——列表

    应用场景,要统计大量的人员信息.就可以用列表的形式进行.name = ['邱秀','玄永俊','杨栋豪']查:print(name[2],name[0]) #取号码进行识别print(name[1:3 ...

  2. JS - 属性描述符各配置的默认值的注意事项

    通过字面量或者obj.x = 1;创建的属性 与 通过Object.defineProperty创建的属性,他们的属性描述符的默认值是不同的,前者都为true,后者都为false.

  3. 爱她就用python给她画个小心心 ♥(ˆ◡ˆԅ)

    from turtle import * a = Turtle() screensize(400, 300, "blue") setup(width=1300, height=65 ...

  4. linux安装openldap步骤

    目录 虚拟机环境:centos 7 一.环境准备 1.关闭 selinux firewalld 临时: setenforce 0  永久: vi /etc/sysconfig/selinux SELI ...

  5. 还在使用pdf、word简历?简单五步实现github托管个人逼格简历

    写在前面: 什么是git.github? git 版本控制工具 github 通过git工具做的版本控制的项目托管平台 项目开发肯定不止一个程序猿,多个程序猿针对同一个文件进行代码读写操作时,是先保存 ...

  6. nuxt generate静态化后回退问题

    之前线上的项目是nuxt build后的项目发布在服务器上,pm2来管理node的进程,nuxt还是运行在node的环境里. 这个方案用了半年左右,访问速度什么的确实很快,pm2管理下的node在wi ...

  7. BeanFactory和IOC控制反转

    之前在看spring,看IOC实在是云里雾里,包括看AOP也是云里雾里的,后来重新学习Java Web,做了一个简单的web项目,再之后看了崔希凡老师的视频,Day27和Day28两天的内容,真的很有 ...

  8. Gson转Map时,Int会变成double解决方法

    package com.cdy.demo; import java.lang.reflect.Type; import java.util.HashMap; import java.util.Map; ...

  9. 数据结构学习-BST二叉查找树 : 插入、删除、中序遍历、前序遍历、后序遍历、广度遍历、绘图

    二叉查找树(Binary Search Tree) 是一种树形的存储数据的结构 如图所示,它具有的特点是: 1.具有一个根节点 2.每个节点可能有0.1.2个分支 3.对于某个节点,他的左分支小于自身 ...

  10. Python学习之函数参数

    上一节,我们学习了Python中是如何定义和调用函数且如何得到返回值的.在调用函数时,有的函数需要参数来启动函数,有的则无需参数.这一节我们来介绍Python中有哪些参数类型. 位置参数 在调用函数时 ...