原题

给个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. Centos7下MySql5.7安装及配置

    安装MySql 软件包: mysql-community-libs-5.7.22-1.el7.x86_64.rpm mysql-community-common-5.7.22-1.el7.x86_64 ...

  2. js动画之无缝滚动

    效果图如下: HTML代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  3. 使用select2 宽度自适应

    加一个CSS属性:style = "width : 100%"

  4. SEOer必读:50个网站推广方法

    1.论坛推广 这里所说的论坛推广绝对不是在论坛里一个一个版贴广告,也不是将网站地址加在签名里然后疯狂刷屏,那样既耗费精力而且效果也不见得好,论坛管理员只要点几下鼠标就能将你的帖子全部删除,顺便封掉你的 ...

  5. LVM(扩展)

    LVM(扩展)======================== [root@aminglinux newdir]# fdisk -l /dev/sdb 磁盘 /dev/sdb:10.7 GB, 107 ...

  6. TP5 webuploader 单页面多实例上传图片 案例

    在使用 webuploader上传文件过程中,如果同一个页面存在多个上传区域,可以参考本示例代码. HTML 代码: <!DOCTYPE html> <html> <he ...

  7. php COM

    查看php.ini中是否已经开启了com.allow_dcom = true 从php/ext/里面查找一下有没有这个php_com_dotnet.dll这个文件 如果没有网上下载个,一般都会有的吧应 ...

  8. win10鼠标右键菜单在左边,怎么改回右边

    键盘上按WIN+R打开运行窗口,输入shell:::{80F3F1D5-FECA-45F3-BC32-752C152E456E}按回车键

  9. Error: Cannot find module 'core-js/fn/array/values' at Function.Module._resolveFilename (module

    E:\codeBase\top605\rescue-master\server\node_modules\_log4js@1.1.1@log4js\lib\log4js.js:321 throw ne ...

  10. 手把手教你如何逐步安装OpenStack

    [TechTarget中国原创] 尽管OpenStack官方提供的在线安装教程和分步向导能够为管理员提供很大帮助,但是依然存在很多不尽如人意的地方.因此在Ubuntu上安装OpenStack的过程当中 ...