当前位置: 首页 > news >正文

UVa 642 Word Amalgamation

题目描述

给定一个包含若干单词的字典(单词由小写字母组成,长度111666,且不重复),字典以一行六个大写字母X"XXXXXX"结束。随后输入若干个待解乱的单词(scrambled words\texttt{scrambled words}scrambled words),同样以"XXXXXX"结束。对于每个待解乱单词,要求找出字典中所有可以由该单词的字母重新排列而成的单词(即字母异位词),并按字典序输出。若没有匹配的单词,则输出"NOT A VALID WORD"。每个查询结果后输出一行六个星号"******"

输入格式

输入包含四部分:

  1. 字典,每行一个单词,以"XXXXXX"结束。
  2. 若干待解乱单词,每行一个,以"XXXXXX"结束。

所有单词均由小写字母组成,长度111666。字典中的单词不重复,但不一定按字典序排列。

输出格式

对于每个待解乱单词,输出一行"NOT A VALID WORD"(若无匹配),否则按字典序输出所有匹配的字典单词,每行一个。无论是否有匹配,最后输出一行六个星号"******"

样例

输入

tarp given score refund only trap work earn course pepper part XXXXXX resco nfudre aptr sett oresuc XXXXXX

输出

score ****** refund ****** tarp trap ****** NOT A VALID WORD ****** course ******

题目分析

本题是经典的“异位词查找”问题。字典大小最多100100100,单词长度不超过666,查询数量未知但通常不多。由于规模极小,可以直接对每个查询遍历整个字典,判断两个单词排序后的字符串是否相同。为了确保输出顺序字典序,可以在读入字典后按原始单词排序。这样在匹配时按顺序输出即可。

解题思路

  1. 读入字典单词,存入结构体数组,每个结构体包含原始单词word和其排序后的字符串sorted(将word的字母排序)。
  2. 按原始单词对结构体进行升序排序,以保证输出时按字典序。
  3. 对于每个查询单词:
    • 将其字母排序得到target
    • 遍历字典结构体数组,若sorted == target,则输出word
    • 若无匹配,则输出"NOT A VALID WORD"
    • 最后输出"******"

由于单词长度很短,排序操作非常快。总复杂度O((D+Q)⋅Llog⁡L)O((D + Q) \cdot L \log L)O((D+Q)LlogL),其中D≤100D \le 100D100QQQ未知,L≤6L \le 6L6,完全可接受。

复杂度分析

  • 预处理字典:排序每个单词O(D⋅Llog⁡L)O(D \cdot L \log L)O(DLlogL),整体排序O(Dlog⁡D)O(D \log D)O(DlogD)
  • 每个查询:排序查询单词O(Llog⁡L)O(L \log L)O(LlogL),遍历字典O(D)O(D)O(D)次比较字符串(O(L)O(L)O(L)),总O(Q⋅D⋅L)O(Q \cdot D \cdot L)O(QDL)
  • 空间复杂度O(D⋅L)O(D \cdot L)O(DL)

代码实现

// Word Amalgamation// UVa ID: 642// Verdict: Accepted// Submission Date: 2016-08-25// UVa Run Time: 0.000s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;structitem{string word,sorted;booloperator<(constitem&another)const{returnword<another.word;}};intmain(){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);vector<item>items;string line;while(getline(cin,line),line.front()!='X'){string backup=line;sort(line.begin(),line.end());items.push_back((item){backup,line});}sort(items.begin(),items.end());while(getline(cin,line),line.front()!='X'){sort(line.begin(),line.end());booloutputed=false;for(autodata:items)if(data.sorted==line){outputed=true;cout<<data.word<<'\n';}if(!outputed)cout<<"NOT A VALID WORD\n";cout<<"******\n";}return0;}

总结

本题通过将单词按字母排序作为“特征串”,将异位词匹配转化为字符串相等比较,实现简单高效。由于数据规模很小,直接遍历字典即可。注意输出格式:每个查询结果后必须紧跟六个星号,无论是否有匹配。该解法清晰直观,是处理字母重排问题的常用技巧。

http://www.cnnetsun.cn/news/3273221.html

相关文章:

  • Linux之进程(六)--环境变量
  • 单 RGB 摄像头实现复杂环境导航!Robostral Navigate 成功率达 76.6%
  • 【LeetCode 手撕算法】(细节知识点总结)
  • 如何构建自进化企业级 Agent 平台
  • 浏览器自动化_agent-browser
  • OpenClaw基础学习
  • 2026年房地产动画行业观察
  • 前端 CDN 缓存策略调优:静态资源、HTML 与 API 分层设计
  • The Impact of Image Resolution on Biomedical Multimodal Large Language Models
  • 【第008篇】通过dexp和dimp命令导出和导入dmp文件(适用于达梦数据库)
  • 香港虚拟资产双轨监管观察:从 MSO 到 VA OTC 的制度演变
  • 三星AI眼镜Galaxy Glasses技术解析:1200万像素摄像头与光致变色镜片的开发实践
  • Claude Code 100个真实案例 - 用AI搭建爬虫数据采集平台(自动翻页+反反爬)
  • 郑州城市职业学院参编清华教材背后的育人突围之路
  • 【Ambari Plus】15.Livy 安装
  • AI 接手一个项目之前,先给它一张可验证的上下文包
  • hive 学习笔记5——hive常用操作(日常短篇练习应用)
  • Claude Code 高级玩法:工作流编排、Token 优化与团队协作
  • M365 Copilot数据访问边界管控实战:基于Microsoft Purview的DSPM落地
  • 专访统丽学子邸斯|勇夺 Nailympia 国际美甲大赛金奖,以指尖艺术奔赴时尚美学之路
  • Python新手最容易踩的10个隐式坑,我刚工作时踩了一半,直接导致线上数据统计出错
  • AI 生图会替代设计师吗?更现实的答案是辅助创意沟通
  • claude code 接入deepseek-v4 pro或者flash模型
  • Python学习小记-类的引用,python下载的依赖管理
  • 【Atlas】 Spark SQL 的执行计划(LogicalPlan/PhysicalPlan)能否被 Atlas 捕获?社区有哪些集成方案?
  • ADP5350与PIC18F85J50嵌入式电源管理方案详解
  • AI 习惯追踪的反馈设计:鼓励不是堆砌赞美,而是记录可见进步
  • 2026年免疫细胞存储行业现状与用户关注方向解析
  • 使用LocalDate和LocalDateTime接收日期时间
  • elasticsearch学习笔记(三十五)——Elasticsearch 索引管理