news 2026/5/10 10:39:56

UVa 195 Anagram

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 195 Anagram

题目分析

本题要求给定一个字符串(可能包含大小写字母),输出其所有不重复的排列,并按字母升序排列。需要注意的是,大写字母排在小写字母之前(即'A' < 'a''B' < 'b'等)。输入的第一行是单词个数nnn,之后nnn行每行一个单词。

例如,输入字符串"aAb"的所有不重复排列按顺序输出为:

Aab Aba abA bAa baA

解题思路

本题的核心是生成字符串的所有不重复排列并按自定义顺序排序。直接使用std::next_permutation\texttt{std::next\_permutation}std::next_permutation可以方便地生成下一个排列,但需要自定义比较函数来实现题目要求的排序规则(大写字母优先于对应的小写字母)。

排序规则(自定义比较函数)

比较两个字符xxxyyy时:

  1. 如果两者都是大写或都是小写,直接按ASCII码比较。
  2. 如果xxx是大写、yyy是小写:
    • 先将xxx转为小写,若与yyy相等,则xxx应排在yyy前面(返回true\texttt{true}true);
    • 否则按小写后的值比较。
  3. 如果xxx是小写、yyy是大写:
    • 先将yyy转为小写,若与xxx相等,则xxx应排在yyy后面(返回false\texttt{false}false);
    • 否则按小写后的值比较。

这样保证了排序结果满足题目要求。

去重处理

使用一个set<string>来记录已经输出过的排列,避免重复。由于next_permutation\texttt{next\_permutation}next_permutation在遇到重复字符时也会生成重复的排列,因此需要手动去重。

算法流程

  1. 读入单词个数nnn
  2. 对每个单词,先按自定义规则排序,得到最小的排列。
  3. 循环调用next_permutation\texttt{next\_permutation}next_permutation生成下一个排列,若未输出过则输出并存入集合。
  4. 处理完一个单词后,清空集合(或重新定义,以保证不同单词之间的去重互不影响)。

代码实现

// Anagram// UVa ID: 195// Verdict: Accepted// Submission Date: 2016-03-15// UVa Run Time: 0.202s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;// 存储已经输出过的排列,用于去重set<string>existed;// 自定义比较函数,实现大写字母优先于小写字母的排序规则boolcmp(charx,chary){// 如果 x 和 y 同为大小写或同为小写,直接按 ASCII 比较if(isupper(x)&&isupper(y)||islower(x)&&islower(y))returnx<y;// x 是大写,y 是小写if(isupper(x)){x=tolower(x);// 将 x 转为小写进行比较if(x==y)// 如果相同(如 'A' 和 'a'),大写应排在前returntrue;elsereturnx<y;}// x 是小写,y 是大写else{y=tolower(y);// 将 y 转为小写进行比较if(x==y)// 如果相同(如 'a' 和 'A'),小写应排在后returnfalse;elsereturnx<y;}returnfalse;}intmain(){// 加速输入输出cin.tie(0);cout.sync_with_stdio(false);intn;// 单词个数cin>>n;while(n--){string line;cin>>line;// 读入当前单词// 按自定义规则排序,得到最小的排列sort(line.begin(),line.end(),cmp);do{// 如果当前排列尚未输出过,则输出并记录if(existed.count(line)==0){cout<<line<<endl;existed.insert(line);}}while(next_permutation(line.begin(),line.end(),cmp));// 清空集合,以便处理下一个单词(也可以重新定义 existed)existed.clear();}return0;}

要点总结

  • 自定义比较函数是本题的关键,需要正确处理大小写字母的混合排序。
  • 使用next_permutation\texttt{next\_permutation}next_permutation可以方便地生成所有排列,但需要预先对字符串排序。
  • 使用set\texttt{set}set可以高效去重,注意不同单词之间需要清空集合。
  • 输入输出优化(cin.tie(0)\texttt{cin.tie(0)}cin.tie(0)sync_with_stdio(false)\texttt{sync\_with\_stdio(false)}sync_with_stdio(false))能提高运行效率,避免超时。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 10:38:53

WaveTools鸣潮工具箱:游戏性能优化与数据分析的完整解决方案

WaveTools鸣潮工具箱&#xff1a;游戏性能优化与数据分析的完整解决方案 【免费下载链接】WaveTools &#x1f9f0;鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools是一款专为《鸣潮》PC玩家设计的开源游戏工具箱&#xff0c;通过帧率优化…

作者头像 李华
网站建设 2026/5/10 10:37:36

CANN/ascend-transformer-boost LinearParallelOperation C++示例

加速库LinearParallelOperation C Demo 【免费下载链接】ascend-transformer-boost 本项目是CANN提供的是一款高效、可靠的Transformer加速库&#xff0c;基于华为Ascend AI处理器&#xff0c;提供Transformer定制化场景的高性能融合算子。 项目地址: https://gitcode.com/ca…

作者头像 李华
网站建设 2026/5/10 10:37:35

如何一键实现多平台直播同步?OBS多路推流插件完全指南

如何一键实现多平台直播同步&#xff1f;OBS多路推流插件完全指南 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 你是否曾经为了在不同直播平台间来回切换而手忙脚乱&#xff1f;或者因…

作者头像 李华
网站建设 2026/5/10 10:37:28

视频加速控制器:掌控在线视频播放速度的终极解决方案

视频加速控制器&#xff1a;掌控在线视频播放速度的终极解决方案 【免费下载链接】videospeed HTML5 video speed controller (for Google Chrome) 项目地址: https://gitcode.com/gh_mirrors/vi/videospeed 你是否曾因视频播放速度太慢而焦虑&#xff1f;每天面对海量的…

作者头像 李华