解题报告(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

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

Java高效实现Word转PDF的完整指南

《Java高效实现Word转PDF的完整指南》这篇文章主要为大家详细介绍了如何用Spire.DocforJava库实现Word到PDF文档的快速转换,并解析其转换选项的灵活配置技巧,希望对大家有所帮助... 目录方法一:三步实现核心功能方法二:高级选项配置性能优化建议方法补充ASPose 实现方案Libre

Python批量替换多个Word文档的多个关键字的方法

《Python批量替换多个Word文档的多个关键字的方法》有时,我们手头上有多个Excel或者Word文件,但是领导突然要求对某几个术语进行批量的修改,你是不是有要崩溃的感觉,所以本文给大家介绍了Py... 目录工具准备先梳理一下思路神奇代码来啦!代码详解激动人心的测试结语嘿,各位小伙伴们,大家好!有没有想

Python实现Word转PDF全攻略(从入门到实战)

《Python实现Word转PDF全攻略(从入门到实战)》在数字化办公场景中,Word文档的跨平台兼容性始终是个难题,而PDF格式凭借所见即所得的特性,已成为文档分发和归档的标准格式,下面小编就来和大... 目录一、为什么需要python处理Word转PDF?二、主流转换方案对比三、五套实战方案详解方案1:

Python清空Word段落样式的三种方法

《Python清空Word段落样式的三种方法》:本文主要介绍如何用python-docx库清空Word段落样式,提供三种方法:设置为Normal样式、清除直接格式、创建新Normal样式,注意需重... 目录方法一:直接设置段落样式为"Normal"方法二:清除所有直接格式设置方法三:创建新的Normal样