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. Qt 计算两个日前间隔天数

    某一个大神写的 改写了一点 请无视注释 //时间计算法则 /********************************************************************** ...

  2. selenide 自动化测试进阶一: 查找元素和相关操作

    基础环境配置和举例请移步:https://www.cnblogs.com/davice/p/9298742.html 提到自动化有些测试同学就会问,我会使用工具录制做自动化,我会用工具或插件识别元素. ...

  3. Java小记(1)

    return 关键字 package mytest; public class Test4 { public static void main(String[] args) { // TODO Aut ...

  4. Visual Studio Code 工具使用教程

    软件下载这里就不用讲了,安装完之后: 1.切换中文: 选择扩展 搜索“Language”,在下列选项选择 Chinese (Simplified) Language Pack for Visual S ...

  5. Linux命令应用大词典-第8章 日期和时间

    8.1 cal:显示日历信息 8.2 date:显示和设置系统日期和时间 8.3 hwclock:查看和设置硬件时钟 8.4 clock:查看和设置硬件时钟 8.5 clockdiff:主机之间测量时 ...

  6. C++错误:Process returned -1073741571 (0xC00000FD)

    最近写程序时,需要将一个一维数组编程二维数组,很简单,写完之后,运行错误! 提示:Process returned -1073741571 (0xC00000FD) 刚开始写的代码如下: #inclu ...

  7. lintcode539 移动零

    移动零 给一个数组 nums 写一个函数将 0 移动到数组的最后面,非零元素保持原数组的顺序 注意事项 1.必须在原数组上操作2.最小化操作数 您在真实的面试中是否遇到过这个题? Yes 样例 给出  ...

  8. CSP201312-2:ISBN号码

    引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...

  9. simhash和minhash实现理解

    文本相似度算法 minhash minhash 1. 把文档A分词形成分词向量L 2. 使用K个hash函数,然后每个hash将L里面的分词分别进行hash,然后得到K个被hash过的集合 3. 分别 ...

  10. javaScript中两个等于号和三个等于号之间的区别

    一言以蔽之:==先转换类型再比较,===先判断类型,如果不是同一类型直接为false. ===表示恒等于,比较的两边要绝对的相同 alert(0 == ""); // trueal ...