http://poj.org/problem?id=1204

题目大意:给一个字母表,求一些字符串的开端第一次出现的位置和字符串的方向(字符串可以按照八个方向放在字母表中可匹配的位置)

————————————————————————————————

一定是AC自动机,而且我们不可能对二位字母表AC一下,所以我们要把待匹配串AC一下,然后枚举字母表的起点(不要枚举多了),ACcheck一下就好了,蛮裸的。

为了保证最小序,需要对枚举顺序改一下,具体循环方法我piao了这位大佬的博客

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
const int L=;
const int C=;
const int M=;
const int W=;
int dx[]={,,,-,,,-,-};
int dy[]={,,-,,-,,,-};
char dir[]={'C','E','G','A','F','D','B','H'};
struct trie{
int ed;
int a[];
int fail;
int l;
}tree[C*L]={};
char mp[L][C],s[M];
int ans[W][];
bool vis[W];
int cnt=,l,c,w;
inline void insert(int k){
int now=;
int len=strlen(s);
for(int i=;i<len;i++){
int t=s[i]-'A';
if(!tree[now].a[t]){
cnt++;
tree[now].a[t]=cnt;
}
now=tree[now].a[t];
}
tree[now].ed=k;
tree[now].l=len;
return;
}
int q[C*L];
void getfail(){
int r=;
//以下是对第一层的特殊处理
for(int i=;i<;i++){
if(tree[].a[i]!=){
tree[tree[].a[i]].fail=;
r++;q[r]=tree[].a[i];
}
}
for(int l=;l<=r;l++){
int u=q[l];
for(int i=;i<;i++){
if(tree[u].a[i]!=){
tree[tree[u].a[i]].fail=tree[tree[u].fail].a[i];
r++;q[r]=tree[u].a[i];
}else{
tree[u].a[i]=tree[tree[u].fail].a[i];
}
}
}
return;
}
void check(int x,int y,int d){
int now=;
while(x>=&&x<l&&y>=&&y<c){
int t=mp[x][y]-'A';
now=tree[now].a[t];
for(int j=now;j;j=tree[j].fail){
int k=tree[j].ed;
int len=tree[j].l-;
if(k&&!vis[k]){
vis[k]=;
ans[k][]=x-dx[d]*len;
ans[k][]=y-dy[d]*len;
ans[k][]=d;
}
}
x+=dx[d];
y+=dy[d];
}
return;
}
int main(){
cin>>l>>c>>w;
for(int i=;i<l;i++){
cin>>mp[i];
}
for(int i=;i<=w;i++){
cin>>s;
insert(i);
}
getfail();
for(int i=;i<l;i++)
for(int j=;j<;j++)
check(i,,j);
for(int i=;i<l;i++)
for(int j=;j<;j++)
check(i,c-,j);
for(int i=;i<c;i++)
for(int j=;j<;j++)
check(,i,j);
for(int i=;i<c;i++)
for(int j=;j<;j++)
check(l-,i,j);
for(int i=;i<=w;i++)
printf("%d %d %c\n",ans[i][],ans[i][],dir[ans[i][]]);
return ;
}

POJ1204:Word Puzzles——题解的更多相关文章

  1. poj1204 Word Puzzles

    Word Puzzles Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 12090   Accepted: 4547   S ...

  2. POJ1204 Word Puzzles(AC自动机)

    给一个L*C字符矩阵和W个字符串,问那些字符串出现在矩阵的位置,横竖斜八个向. 就是个多模式匹配的问题,直接AC自动机搞了,枚举字符矩阵八个方向的所有字符串构成主串,然后在W个模式串构造的AC自动机上 ...

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

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

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

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

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

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

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

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

  7. Word Puzzles

    poj1204:http://poj.org/problem?id=1204 题意:给你n*m的字符串矩阵,然后p个查询,每个查询会给出一个字符串,然后问你在矩阵中能否通过8个方向搜索到这个字符串,输 ...

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

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

  9. POJ 1204 Word Puzzles | AC 自动鸡

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

随机推荐

  1. MongoDB-Ubuntu环境下安装

    1.在官网下载安装包,下载后为 mongodb-linux-x86_64-ubuntu1604-3.4.6.tgz 解压:tar -zxvf mongodb-linux-x86_64-ubuntu16 ...

  2. linux-flock文件锁之实际运用

    vi test.sh #! /bin/bash echo "Hello World" touch test.lock #随便命名 [root@localhost ~]# flock ...

  3. ElasticSearch-Java-low-level-rest-client官方文档翻译

    人肉翻译,非谷歌机翻,部分地方添加了个人的理解,并做了分割,如有错误请在评论指出.转载请指明原链接,尊重个人劳动成果.        High-Level-Rest-Client基于Low-Level ...

  4. 怎样通过Qt编写C/C++代码查询当前Linux的版本号?

    遇到一个问题:如题. 我的开发环境是:嵌入式ARM + Linux系统 + Qt 4.5 + C/C++ 现在需要查询 当前Linux系统的版本号. 问题: 1)Qt 4.5 提供怎样的API来获取? ...

  5. GameplayKit的GKStateMachine用法与实例

    GKStateMachine 玩家进入GameScene场景中 -> 通过GKStateMachine进入到指定的游戏状态GKState 在GameScene场景中 -> 根据不同的逻辑调 ...

  6. (Pyhton爬虫03)爬虫初识

    原本的想法是这样的:博客整理知识学习的同时,也记录点心情...集中式学习就没这么多好记录的了! 要学习一门技术,首先要简单认识一下爬虫!其实可以参考爬虫第一章! 整体上介绍该技术包含技能,具体能做什么 ...

  7. JDBC中使用Properties类及配置文件的操作

    同时发布于:https://blog.csdn.net/Activity_Time/article/details/81149710 一.properties配置文件 开发中获得连接的4个参数(驱动. ...

  8. JAVA 面试须知

    本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺. 1. Java中的原始数据类型都有哪些, ...

  9. BOM / URL编码解码 / 浏览器存储

    BOM 浏览器对象模型 BOM(Browser Object Model) 是指浏览器对象模型,是用于描述这种对象与对象之间层次关系的模型,浏览器对象模型提供了独立于内容的.可以与浏览器窗口进行互动的 ...

  10. 一:yarn 介绍

        yarn的了出现主要是为了拆分jobtracker的两个核心功能:资源管理和任务监控,分别对应resouceManager(RM)和applicationManager(AM).yarn中的任 ...