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

UVa 454 Anagrams

题目描述

题目要求找出给定短语列表中的所有互为变位词(anagram\texttt{anagram}anagram)的短语对。变位词忽略空格,仅考虑字母的重排。输出时每对短语按字典序排列,且短语对之间也按字典序排序。

输入格式

第一行一个整数NNN,表示测试用例的数量,后面跟一个空行。每个测试用例包含若干行(最多100100100行),每行一个短语(可能包含空格)。输入以空行结束。两个连续测试用例之间由一个空行分隔。

输出格式

对于每个测试用例,输出所有变位词对,每行格式为phrase1 = phrase2,其中phrase1phrase2按字典序排列,且所有输出行也按字典序排列。若没有变位词对,则不输出任何行。两个连续测试用例的输出之间由一个空行分隔。

样例

输入

1 carthorse horse horse cart i do not know u ok i now donut orchestra

输出

carthorse = horse cart carthorse = orchestra horse cart = orchestra i do not know u = ok i now donut

题目分析

本题的核心是判断两个短语是否为变位词。变位词的定义是:忽略空格后,两个短语包含相同的字母,且每个字母出现的次数相同。

标准化表示

为了便于比较,可以将每个短语转换为一个标准化的字符串:

  1. 去除所有空格。
  2. 将剩余字符按字母顺序排序。
  3. 排序后的字符串作为该短语的“签名”。

若两个短语的签名相同,则它们互为变位词。

算法步骤

  1. 读取所有短语,存储原始字符串。
  2. 对于每个短语,生成其签名(去空格后排序)。
  3. 将所有短语按原始字符串字典序排序。
  4. 枚举所有短语对(i,j)(i, j)(i,j)i<ji < ji<j),若签名相同,则输出words[i] = words[j]
  5. 由于原始字符串已排序,且i<ji < ji<j,输出自然满足字典序要求。

注意点

  • 输入中的空行表示测试用例结束,需要正确处理。
  • 短语可能包含多个空格,需要全部去除。
  • 输出时两个短语之间用=分隔(空格-等号-空格)。

复杂度分析

设短语数量为MMMM≤100M \le 100M100),每个短语长度不超过若干字符。排序复杂度O(Mlog⁡M)O(M \log M)O(MlogM),枚举对O(M2)O(M^2)O(M2),完全可接受。

代码实现

// Anagrams// UVa ID: 454// Verdict: Accepted// Submission Date: 2016-07-17// UVa Run Time: 0.000s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;intmain(intargc,char*argv[]){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);string line;getline(cin,line);intcases=stoi(line);getline(cin,line);for(inti=1;i<=cases;i++){if(i>1)cout<<endl;vector<string>words;map<string,string>sorted;while(getline(cin,line),line.length()>0){words.push_back(line);for(inti=line.length()-1;i>=0;i--)if(isblank(line[i]))line.erase(line.begin()+i);sort(line.begin(),line.end());sorted[words.back()]=line;}sort(words.begin(),words.end());for(inti=0;i<words.size();i++)for(intj=i+1;j<words.size();j++)if(sorted[words[i]]==sorted[words[j]])cout<<words[i]<<" = "<<words[j]<<'\n';}return0;}
http://www.jsqmd.com/news/995847/

相关文章:

  • 从一次Sonar告警深入理解Java线程中断:为什么catch了InterruptedException还得再interrupt一次?
  • 别再用pow函数求立方根了!C/C++里这个二分法技巧更稳(附精度控制详解)
  • 2026年重庆家装市场深度解析:十大靠谱装修公司评选及消费指南 - 互联网科技品牌测评
  • Windows 11系统优化完整教程:用Win11Debloat打造纯净高效体验
  • 3分钟极速上手!LLM Universe模型下载神器全攻略 [特殊字符]
  • 大模型底层原理:MoE 混合专家架构的推理优化与工程实践
  • 突破传统 AI 训练!USTC 提出 Role-Agent 双角色共演机制
  • 告别PWM配置玄学:深入S32K14x的FTM模块,搞懂重装载(Reload)机制与中断回调
  • RuoYi-Vue Pro工作流审批系统架构设计与技术实现深度解析
  • 深入机箱与线缆:单点、多点接地在EMC整改中的‘隐身’实战(以某工控设备为例)
  • GnuRadio实战:手把手教你用Python和C++混合编程实现OQPSK解调(附源码解析)
  • 从星巴克排队到云服务器扩容:聊聊M/M/1模型里那个关键的ρ(rho)到底是什么意思?
  • FanControl V269终极指南:Windows平台风扇控制的专业级解决方案
  • 2026年脱硫泵供应商选择指南:行业格局、技术趋势与关键厂商分析 - 优质品牌商家
  • 2026年成都喷砂机生产厂家实力测评:这些企业值得关注! - 优质品牌商家
  • Pearcleaner:让你的Mac告别“数字幽灵“,重获纯净空间
  • 别再只盯着MQTT了!聊聊物联网里那个更省电的CoAP协议,附Wireshark抓包实战
  • 从一行代码看Python设计哲学:lambda匿名函数的前世今生与最佳实践
  • Codex 关闭手动确认 - Higurashi
  • 从双寡头到多智能体:用反应函数法分析AI智能体在模拟环境中的竞争策略
  • Redis 从入门到精通:事务与 Lua 脚本
  • 2026年成都外墙渗水维修市场深度分析:谁在提供真正可靠的服务? - 优质品牌商家
  • 【Springboot毕设全套源码+文档】springboot基于区块链的电子病历数据共享平台设计与实现(丰富项目+远程调试+讲解+定制)
  • 40+格式一网打尽:open3mod让你的3D模型查看体验起飞 [特殊字符]
  • Cortex-M33开发踩坑记:从HardFault反查BusFault与UsageFault的完整调试流程
  • 详细讲述软件实验室CMA资质认定中最复杂的一部分——记录
  • 本地部署 AI 资产管理系统 New API 并实现外部访问
  • 港科大EMBA全球排名多少?2026权威榜单完整解析
  • 计算机毕业设计之基于人脸识别的小区门禁管理系统
  • 高通座舱芯片的‘深度睡眠’:手把手教你验证STR/S2R模式(以Q+A平台为例)