原题

给个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. lintcode_177_把排序数组转换为高度最小的二叉搜索树

    把排序数组转换为高度最小的二叉搜索树   描述 笔记 数据 评测 给一个排序数组(从小到大),将其转换为一棵高度最小的排序二叉树. 注意事项 There may exist multiple vali ...

  2. Maven - 依赖范围<scope></scope>

    6种:

  3. MySQL自增锁等待问题解决

    有网友再群里问:在做基准测试时候,批量插入数据时,有很多自增锁等待,我告诉他解决办法: 1.innodb_autoinc_lock_mode=2 2.innodb_autoextend_increme ...

  4. thinkphp5,单图,多图,上传

    /** * 上传单图 */ function upload($path, $filename) { $file = request()->file($filename); $info = $fi ...

  5. Linux下 VI 编辑器操作

    VI编辑器的三种模式:命令模式.输入模式.末行模式. 1.命令模式:vi启动后默认进入的是命令模式,从这个模式使用命令可以切换到另外两种模式,同时无论在何种模式下,[Esc]键都可以回到命令模式.在命 ...

  6. 边缘检测 opencv

    本次实验使用了两种方法进行了边缘检测,分别使用到了opencv中的两个API函数为Canny()和Sobel()函数.实验后加了Scharr滤波器,它其实是基于Sobel()函数的. 这三个API中的 ...

  7. 01,jupyter环境安装

    jupyter notebook环境安装 一.什么是Jupyter Notebook? 1. 简介 Jupyter Notebook是基于网页的用于交互计算的应用程序.其可被应用于全过程计算:开发.文 ...

  8. Toolbar中menu菜单文字颜色的修改

    Toolbar菜单中menu当中我们大多数都使用图片来按钮,可是有些时候我们也会直接使用文字,文字的颜色如何修改呢. 其实很简单,我们只要修改styles.xml文件中,添加一句 <item n ...

  9. .net 下word 中的图片与文字分离

    最近在做一个项目要求word 中的图片与文字分离 ,找了好久终于找到一个完美的方法 c#实现word中的图文分离   part 1: class define Code highlighting pr ...

  10. UasyUi的各种方法整理

    UasyUi的各种方法整理: 1.拖动 放置 droppable $('#dd').droppable({ }); 2.创建可变大小的窗口 resizable $('#rr').resizable({ ...