C. Crossword Validation(字典树)

news2024/10/6 22:29:20

Problem - C - Codeforces

题意:

你得到了一个在N×N网格上完成的填字游戏。每个单元格要么是填有字母的白色单元格,要么是黑色单元格。你还会得到一本包含M个不同单词的字典,其中每个单词都有一个与之相关的分数。网格中的一个横向候选词是在网格的同一行上的一串连续的字母,不能被扩展。从形式上看,这意味着候选词最左边的单元格要么不存在,要么是一个黑色单元格,最右边的单元格也是如此。垂直候选词的定义与此类似,只是字母在同一列。候选词对于水平词来说是从左到右阅读,对于垂直词来说是从上到下阅读。当且仅当每个候选词都出现在给定的词典中时,该填字游戏才是有效的。一个有效的字谜的分数是字典中与每个候选词相关的分数之和。请注意,两个或多个候选词可能是相同的。在这种情况下,该词的分数会相应地被多次加分。你的程序必须确定谜题的分数,否则就报告说它无效。

输入
输入包含多个案例。输入的第一行包含一个正整数T,即案例的数量。

对于每个案例,输入的第一行包含两个整数N,M(1≤N≤1000,1≤M≤4×106),即网格的大小和字典中的单词数。接下来的N行各包含一个长度为N的字符串,其中每个字符是小写英文字母或'#'。如果第i个字符串中的第j个字符是'#',那么位于第i行和第j列交汇处的单元格就是一个黑色单元。否则,这个字符表示该单元格中填入的字母。下面的M行,每一行都包含一个只由小写英文字母组成的非空字符串,以及一个正整数,表示字典中的一个词和它的分数。保证这M个词是成对的,每个词的长度不超过N,每个词的分数不超过109。

保证所有情况下N2的总和不超过4×106,所有情况下字典中所有单词的长度之和不超过4×106。

输出
对于每个案例,在单行中打印一个整数,即输入中给出的字谜解决方案的分数,如果它是有效的。如果解决方案无效,则打印-1。

题解:

根据题意,看每行每列的最长字符串是否在所给的字符串中全都出现过

所以我们应该先构造一个根据所给字符串的字典树

接着枚举所有列和行的的最长字符串看是否在我们构建的字典树中出现过,

出现过加上,没直接输出-1即可

代码有三点需要注意的

1.注意初始化,初始化掉之前变化过的即可,否则会t

2.一个知识点,如果字符串的第i位赋值为0(int),相当于在i处加了一个终止符,无论是输入,还是输出,还是传递,到i都会停止,当然如果原本i后面有值,依旧存在

3.因为在询问的过程中,有可能出现,所询问字符串,在一个所给字符串的子串中的情况

所以,还要判断赋值是否为0

#include<iostream>
#include<cstring>
using namespace std;
int n,m;
char mp[1005][10005];
char s[1005];
int idx;
int cnt[4000050];
int tre[4000050][30];
void insert(char t[1005],int v)
{
	int len = strlen(t);
	int now = 0;
	for(int i = 0;i < len;i++)
	{
		int ne = t[i]-'a';
		if(!tre[now][ne])
		tre[now][ne] = ++idx;
		now = tre[now][ne];
	}
	cnt[now] += v;
}
int query(char t[1005])
{
	int len = strlen(t);
	int now = 0;
	for(int i = 0;i < len;i++)
	{
		int ne = t[i] - 'a';
		if(!tre[now][ne])
		return  -1;
		now = tre[now][ne];
	}
	if(!cnt[now])//存在一个字典中存在一个子串为t的字符串,所以无值 
	return  -1;
	else
	return cnt[now];
}
void solve()
{
	cin >>n >> m;
	for(int i = 0;i <= idx;i++)
	{
		memset(tre[i],0,sizeof tre[i]); 
		cnt[i] = 0;
	}
	idx = 0;
	// 初始部分即可,不然会t 
	
	
	
	
	
	for(int i = 1;i <= n;i++)
	{
		cin >> mp[i]+1;
	}
	for(int i = 1;i <= m;i++)
	{
		int v;
		cin >> s>>v;
		insert(s,v);
	}
	long long ans = 0;
	int f = 0;
	for(int i = 1;i <= n;i++)
	{
		for(int j = 1;j <= n;j++)
		{
			if(mp[i][j] == '#')
			continue;
			int k = 0;
			while(mp[i][j] != '#'&&j <= n)
			{
				s[k++] = mp[i][j++];
			}
			s[k] = 0;//一个知识点,如果字符串的第i位赋值为0(int),相当于在i处加了一个终止符,无论是输入,还是输出,还是传递,到i都会停止,当然如果原本i后面有值,依旧存在
            int p = query(s);
	        if(p == -1)
			{
				f = 1;
			} 
			else
			{
				ans += p; 
			}
			
		}
	}
	
	for(int j = 1;j <= n;j++)
	{
		for(int i = 1;i <= n;i++)
		{
			if(mp[i][j] == '#')
			{
				continue;
			}
			int k = 0;
			while(mp[i][j]!='#'&&i <= n)
			{
				s[k++] = mp[i++][j];
			}
			s[k] = 0;
			int p = query(s);
			if(p == -1)
			f= 1;
			else
			ans += p;
		}
	}
	if(f)
	{
		cout<<-1<<"\n";
	}
	else
	{
		cout<<ans<<"\n";
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin >> t;
	while(t--)
	{
		solve();
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/4826.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android TCPIP常见问题

book: Understanding Linux Network Internals socket读写错误返回值&#xff1a;errno TCP: Robert Elliot Kahn IP: Robert Elliot Kahn, Vint Cerf 1 RFC规范 RFC793&#xff1a;TCP RFC768&#xff1a;UDP RFC791&#xff1a;IP RFC826&#xff1a;ARP RFC792&#xff1a;I…

请求转发与请求重定向的区别

目录 1.实现 2.具体区别 1.有关实现 请求转发与重定向分别对应forward 和 redirect两个关键字&#xff0c;接下来我们在Java中尝试去实现一下。 1.1 请求转发 我们一般使用两种方式实现&#xff0c;具体代码见下&#xff1a; RequestMapping("/fw")public Strin…

【C】语言文件操作(一)

&#x1f648;个人主页&#xff1a; 阿伟t &#x1f449;系列专栏&#xff1a;【C语言–大佬之路】 &#x1f388;今日心语&#xff1a;越忙&#xff0c;越要沉住气&#xff01; 本章重点 : 为什么使用文件什么是文件文件的打开和关闭文件的顺序读写文件的随机读写文本文件和…

Netty之I/O模型

UNIX提供的5种IO模型&#xff1a; 阻塞模型 阻塞IO模型&#xff1a; IO复用模型&#xff1a; 信号驱动IO模型&#xff1a; 对于五种IO模型我这里用自己的白话再复述一遍&#xff0c;加深理解&#xff0c;如果要看权威的解释可以自己去看《Netty权威指南》。 阻塞IO 进…

【算法】树状数组数据结构

文章目录Part.I 预备知识Chap.I 一些前提和概念Chap.II lowbit 函数Part.II 树状数组Chap.I 树状数组的思想Chap.II 树状数组的构造Part.III 树状数组的应用Chap.I LeetCode: 2426. 满足不等式的数对数目Sec.I 题目描述与分析Sec.II 代码实现Chap.II LeetCode: 51. 数组中的逆序…

计算机网络-网络层(ARP协议,DHCP协议,ICMP协议)

文章目录1. ARP协议2. DHCP协议3. ICMP协议1. ARP协议 首先数据在从网络层向下传递到数据链路层&#xff0c;在数据链路层中&#xff0c;要给报文封装源MAC地址和目的MAC地址。 其中获取目的MAC地址就是通过ARP协议 首先&#xff1a;每台主机都有一个ARP高速缓存&#xff08…

【VC++】字符串详解窗口第一个windows程序

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录系统调用顺序对比怎样避免确实动态链接库基本知识类型列表指针类型匈牙利标记法字符串详解Unicode 和 ANSI 函数TCHARs窗口WinMain我的博客即将同步至腾讯云开发者社区&#xff0c;邀请大家一同入驻&#xf…

微信小程序开发(超详细保姆式教程)

介绍&#xff1a; 微信里面app&#xff0c;16年推出 竞品&#xff1a;支付宝小程序&#xff0c;钉钉&#xff0c;美团&#xff0c;头条&#xff0c;抖音qq小程序 优点 1&#xff0c;在微信里面自由分享&#xff0c;2&#xff0c;不用下载app&#xff0c;3,能快速的开发&#xf…

【MySQL】如何把Windows上的MySQL数据库迁移到Linux服务器上

目录1. 前言2. 物理备份与逻辑备份3. mysqldump实现逻辑备份4. 逻辑恢复1. 前言 最近在学黑马的《瑞吉外卖》&#xff0c;前期的基础版本一致在 Windows 电脑上开发&#xff0c;包括 MySQL 数据库也是安装在 Windows 电脑上。最近才学到优化篇&#xff0c;安装了 Linux 虚拟机…

【成为红帽工程师】第二天 ssh远程连接服务器

目录 一、远程连接服务器 二、连接加密技术 三、ssh远程连接服务 四、sftp用法介绍 五、相关实验 一、远程连接服务器 &#xff08;一&#xff09;什么是远程连接服务器 远程连接服务器通过文字或图形接口方式来远程登录系统&#xff0c;让你在远程终端前登录linux主机…

2022年最新山东交安安全员模拟真题及答案

百分百题库提供交安安全员考试试题、交安安全员考试真题、交安安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 43.危险性较大工程专项施工方案需要论证的&#xff0c;应当由建设单位组织召开专家论证会。 答案&#…

计算机毕业设计SSM财务管理系统【附源码数据库】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

计算机毕业设计SSM城市智能公交系统【附源码数据库】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

MyBatis(4)---多表查询

多表查询: 一对一:一篇博客对应着一个作者 一对多:一个作者对应着多篇博客 ResultMap和ResultType的区别: 1)字段映射不同:resultType适用于数据库字段名和实体类的名字是相同的&#xff0c;但是假设实体类的名字叫做username&#xff0c;但是数据库的名字是name&#xff0c;这…

MyBatis(3)

我们在进行指定ID进行删除的时候还可以加上一个属性:表示要传递的参数的类型是啥 <delete id"Delete" parameterType"java.lang.Integer">delete from user where userID#{userID}</delete> 我们现在先实现一个场景----我们来进行查询一下User…

【毕业设计】大数据共享单车数据分析系统 - python

文章目录0 前言1 项目背景2 项目分析思维导图3 项目分析具体步骤3.1 读取数据3.2 数据分析3.1.1 数据预处理——每日使用量分析3.1.2 连续7天的单日使用分析结论3.1.3 数据预处理——每日不同时间段的使用量分析3.1.4 每日不同时间段使用量分析结论3.1.5 数据预处理——骑行距离…

【C++】智能指针

一、资源的管理 RAII:Resource Acquisition Is Initialization的简称&#xff0c;其翻译过来就是“资源获取即初始化”&#xff0c;即在构造函数中申请分配资源&#xff0c;在析构函数中释放资源&#xff0c;它是C语言中的一种管理资源、避免泄漏的良好方法。 C语言的机制保证…

python快速实现简易超级玛丽小游戏

《超级玛丽》是一款超级马里奥全明星的同人作品&#xff0c;也是任天堂公司出品的著名横版游戏。 《超级马里奥》是一款经典的像素冒险过关游戏。最早在红白机上推出&#xff0c;有多款后续作品&#xff0c;迄今多个版本合共销量已突破4000万套。其中的主角马里奥、路易、碧琪…

[附源码]计算机毕业设计JAVAjsp闲置物品线上交易系统

[附源码]计算机毕业设计JAVAjsp闲置物品线上交易系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM …

tensor和numpy相互转换

tensor转成numpy b a.numpy()import torcha torch.arange(5) b a.numpy() print(a) print(type(a)) print(b) print(type(b))numpy转成tensor b torch.tensor(a)import torch import numpy as npa np.ones(5) b torch.tensor(a) print(a) print(type(a)) print(b) prin…