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

相关文章

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

Java利用poi实现word表格转excel

《Java利用poi实现word表格转excel》这篇文章主要为大家详细介绍了Java如何利用poi实现word表格转excel,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、每行对象类需要针对不同的表格进行对应的创建。package org.example.wordToEx

Python如何在Word中生成多种不同类型的图表

《Python如何在Word中生成多种不同类型的图表》Word文档中插入图表不仅能直观呈现数据,还能提升文档的可读性和专业性,本文将介绍如何使用Python在Word文档中创建和自定义各种图表,需要的... 目录在Word中创建柱形图在Word中创建条形图在Word中创建折线图在Word中创建饼图在Word

Python批量调整Word文档中的字体、段落间距及格式

《Python批量调整Word文档中的字体、段落间距及格式》这篇文章主要为大家详细介绍了如何使用Python的docx库来批量处理Word文档,包括设置首行缩进、字体、字号、行间距、段落对齐方式等,需... 目录关键代码一级标题设置  正文设置完整代码运行结果最近关于批处理格式的问题我查了很多资料,但是都没

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

基于Java实现模板填充Word

《基于Java实现模板填充Word》这篇文章主要为大家详细介绍了如何用Java实现按产品经理提供的Word模板填充数据,并以word或pdf形式导出,有需要的小伙伴可以参考一下... Java实现按模板填充wor编程d本文讲解的需求是:我们需要把数据库中的某些数据按照 产品经理提供的 word模板,把数据