解题报告(6)——Word puzzles

2023-11-02 11:48
文章标签 报告 word 解题 puzzles

本文主要是介绍解题报告(6)——Word puzzles,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Word Puzzle

题目描述

给出一个字母地图和一些字符串,请你找出每个字符串的第一个字母在地图中的位置和该字符串的方向。
假设地图左上角为原点(0,0)。可能的方向有8个,从北开始顺时针方向依次编号A~H,北方编号为“A”。

               (方向)

输入格式

第一行包含三个正整数:L(0<L≤1000),C(0<C≤1000),W(0<W≤1000)。其中 L 表示地图的行数,C 表示地图的列数,W 表示字符串的数量。
接下来有 L 行、C 列,为字母地图。
接下来有 W 行,每行一个字符串。

输出格式

对于输入的每个单词串,你需要输出该字符串的第一个字母所在的行、列,以及字符串的方向。三个部分之间用一个空格间隔。
按输入的字符串顺序输出上述信息。

样例数据 1

输入 

20 20 10 
QWSPILAATIRAGRAMYKEI
 
AGTRCLQAXLPOIJLFVBUQ
 
TQTKAZXVMRWALEMAPKCW
 
LIEACNKAZXKPOTPIZCEO
 
FGKLSTCBTROPICALBLBC
 
JEW
HJEEWSMLPOEKORORA 
LUPQWRNJOAAGJKMUSJAE
 
KRQEIOLOAOQPRTVILCBZ
 
QOPUCAJSPPOUTMTSLPSF
 
LPOUYTRFGMMLKIUISXSW
 
WAHCPOIYTGAKLMNAHBVA
 
EIAKHPLBGSMCLOGNGJML
 
LDTIKENVCSWQAZUAOEAL
 
HOPLPGEJKMNUTIIORMNC
 
LOIUFTGSQACAXMOPBEIO
 
QOASDHOPEPNBUYUYOBXB
 
IONIAELOJHSWASMOUTRK
 
HPOIYTJPLNAQWDRIBITG
 
LPOINUYMRTEMPTMLMNBO
 
PAFCOPLHAVAIANALBPFS
 
MARGARITA
 
ALEMA
 
BARBECUE
 
TROPICAL
 
SUPREMA
 
LOUISIANA
 
CHEESEHAM
 
EUROPA
 
HAVAIANA
 
CAMPONESA

输出

0 15 G 
2 11 C
 
7 18 A
 
4 8 C
 
16 13 B
 
4 15 E
 
10 3 D
 
5 1 E
 
19 7 C
 
11 11 H

 

算法分析:

方法一:字典树+深搜 期望:无(数据给力就超时)

(1)建立字典树

(2)通过地图,向八个方向深搜

(3)获取各个方向和地址

 

Source:

无,时间复杂度过高,此处略过。

 

方法二:(多字符串匹配)——AC自动机 期望:100

(1)离线处理,将地图存储,并将每一个询问串跑trie;

(2)建立好trie后,建立AC自动机;

(3)从地图四条边位起点,分别向八个方向,跑匹配,若到达某结束点,记录位置;

 

注意:

1、万分小心,本题所用全部为大写字母,一定不能在建立过程中搞成小写,越界都可以跑出正确答案······

2、注意记录结束点时,要搞清楚自己是记录在询问上,还是AC自动机的节点上······空间要与之相匹配;

3、存储地址时,比较方便的时进行八个方向的打表,并且在之前记录结束接点时,就直接记录下该串长度,方便后面的地址的求取。

 

Source


#include
#include
#include
#include
#include
#includeusing namespace std;const int dx[9]={0,-1,-1, 0, 1, 1, 1, 0,-1};
const int dy[9]={0, 0, 1, 1, 1, 0,-1,-1,-1};
/*dx,dy:指向八个方向的表*/ 
int n,m,q,tot,cnt,head,tail;
/*tot:记录当前询问; cnt:记录当前的动态分配节点*/ 
char s[1010][1010];
/*s:字符分配地图*/
int f[1100000][27],first[1100000],lent[1100000];
/*f:AC自动机; first:记录是否为结束节点即编号; lent:和first对应,当前的长度*/ 
int fail[1100000],queue[11000000];
/*fail:AC自动机fail指针; queue:AC自动机的广搜队列*/
string ss;struct data /*离线:输出记录*/ 
{int x;int y;char dir;
}out[1010];void build(string &s) /*字典树的建立*/
{int position=0;for(int i=0;i>n>>m>>q;for(int i=0;i>s[i];}for(int i=1;i<=q;++i){cin>>ss;build(ss);}
}void build_AC(void)  /*构建AC自动机*/ 
{head=0;tail=1;queue[1]=0;while(head<tail)  /*广搜*/ {head++;for(int i=0;i<26 i="" fail="" if="" f="" queue="" head="" i="" if="" queue="" head="" fail="" f="" queue="" head="" i="" f="" fail="" queue="" head="" i="" tail="" queue="" tail="" f="" queue="" head="" i="" else="" f="" queue="" head="" i="" f="" fail="" queue="" head="" i="" void="" find="" int="" l="" int="" r="" int="" type="" int="" position="0;" while="" l="">=0&&l=0&&r<m) /*越界判断*/ {position=f[position][s[l][r]-'A'];l+=dx[type];   r+=dy[type];  /*保证方向不变,直线处理*/ if(first[position]&&out[first[position]].x<0)/*处理匹配上的字符串信息*/ {int v=first[position];out[v].x=l-lent[position]*dx[type];out[v].y=r-lent[position]*dy[type];out[v].dir=type+'A'-1;}}
}void get(void) /*跑AC匹配*/ 
{for(int k=1;k<=8;++k){for(int i=0;i<n;++i){find(i,0,k);find(i,m-1,k);}for(int i=0;i<m;++i){find(0,i,k);find(n-1,i,k);}}for(int i=1;i<=q;++i){cout<<out[i].x<<" "<<out[i].y<<" "<<out[i].dir<<'\n';}
}int main(void)
{ios::sync_with_stdio(false);cin.tie(NULL);  /*解绑*/ memset(out,-1,sizeof(out)); /*初始化*/read();build_AC();get();return 0;
}



Summary:

本题是一道AC自动机的模板题,是比较裸地AC自动机的多字符串匹配。然而因为自己一而再,再而三的出现很多奇奇葩葩的问题,导致这个题调了很久,AC自动机是基本上每个级别的考试都可能涉及的,是及其法之一,其作用主要在于字符串的处理,查询,匹配以及计数等问题,要牢记。


这篇关于解题报告(6)——Word puzzles的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/330397

相关文章

Python自动化提取多个Word文档的文本

《Python自动化提取多个Word文档的文本》在日常工作和学习中,我们经常需要处理大量的Word文档,本文将深入探讨如何利用Python批量提取Word文档中的文本内容,帮助你解放生产力,感兴趣的小... 目录为什么需要批量提取Word文档文本批量提取Word文本的核心技术与工具安装 Spire.Doc

C#高效实现在Word文档中自动化创建图表的可视化方案

《C#高效实现在Word文档中自动化创建图表的可视化方案》本文将深入探讨如何利用C#,结合一款功能强大的第三方库,实现在Word文档中自动化创建图表,为你的数据呈现和报告生成提供一套实用且高效的解决方... 目录Word文档图表自动化:为什么选择C#?从零开始:C#实现Word文档图表的基本步骤深度优化:C

Qt实现对Word网页的读取功能

《Qt实现对Word网页的读取功能》文章介绍了几种在Qt中实现Word文档(.docx/.doc)读写功能的方法,包括基于QAxObject的COM接口调用、DOCX模板替换及跨平台解决方案,重点讨论... 目录1. 核心实现方式2. 基于QAxObject的COM接口调用(Windows专用)2.1 环境

使用Python将PDF表格自动提取并写入Word文档表格

《使用Python将PDF表格自动提取并写入Word文档表格》在实际办公与数据处理场景中,PDF文件里的表格往往无法直接复制到Word中,本文将介绍如何使用Python从PDF文件中提取表格数据,并将... 目录引言1. 加载 PDF 文件并准备 Word 文档2. 提取 PDF 表格并创建 Word 表格

Python轻松实现Word到Markdown的转换

《Python轻松实现Word到Markdown的转换》在文档管理、内容发布等场景中,将Word转换为Markdown格式是常见需求,本文将介绍如何使用FreeSpire.DocforPython实现... 目录一、工具简介二、核心转换实现1. 基础单文件转换2. 批量转换Word文件三、工具特性分析优点局

Java使用Spire.Doc for Java实现Word自动化插入图片

《Java使用Spire.DocforJava实现Word自动化插入图片》在日常工作中,Word文档是不可或缺的工具,而图片作为信息传达的重要载体,其在文档中的插入与布局显得尤为关键,下面我们就来... 目录1. Spire.Doc for Java库介绍与安装2. 使用特定的环绕方式插入图片3. 在指定位

Java利用Spire.Doc for Java实现在模板的基础上创建Word文档

《Java利用Spire.DocforJava实现在模板的基础上创建Word文档》在日常开发中,我们经常需要根据特定数据动态生成Word文档,本文将深入探讨如何利用强大的Java库Spire.Do... 目录1. Spire.Doc for Java 库介绍与安装特点与优势Maven 依赖配置2. 通过替换

C#实现插入与删除Word文档目录的完整指南

《C#实现插入与删除Word文档目录的完整指南》在日常的办公自动化或文档处理场景中,Word文档的目录扮演着至关重要的角色,本文将深入探讨如何利用强大的第三方库Spire.Docfor.NET,在C#... 目录Spire.Doc for .NET 库:Word 文档处理利器自动化生成:C# 插入 Word

Python实现Word文档自动化的操作大全(批量生成、模板填充与内容修改)

《Python实现Word文档自动化的操作大全(批量生成、模板填充与内容修改)》在职场中,Word文档是公认的好伙伴,但你有没有被它折磨过?批量生成合同、制作报告以及发放证书/通知等等,这些重复、低效... 目录重复性文档制作,手动填充模板,效率低下还易错1.python-docx入门:Word文档的“瑞士

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码