【map练习】Uva156 - Ananagrams题解

今后,日常学习栏目中将专注于新知识本身的探讨,辅助练习题目如果关联不大就会放在基础练习中。

题意:要你找出这样的单词,单词里面的字母不区分大小写,然后字母重排之后只出现一次的单词,找出之后,还是输入的样子以字典序输出

读了ruka上的标程后,自己写了一遍,代码如下:

#include<iostream>
#include<cstdio>
#include<string>
#include<map>
#include<vector>
#include<cctype>//for tolower为了转小写引用的头文件,cctype用于处理字符
#include<algorithm>
using namespace std;

map<string,int> cnt;//定义映射
vector<string> words;//定义不定长数组

string change(string s){//将字符串标准化处理
	for (int i=0;i<s.length();i++) s[i]=tolower(s[i]);//先转为小写
	sort(s.begin(),s.end());//再排序,便于比较
	return s;
}

int main(){
	string s;
	while ((cin>>s)&&(s[0]!='#')){//shall we use scanf when referred to string?不知道stl的字符串能不能用scanf读入并检验
		words.push_back(s);//原始字符串存入不定长数组words中
		string temp=change(s);//标准化
		cnt[temp]++;//由于初值为0,直接++即可
	}
	vector<string> ans;
	for (int i=0;i<words.size();i++){
		if (cnt[change(words[i])]==1) ans.push_back(words[i]);//如果该串只出现了一次,保存原串到不定长数组ans中
	}
	sort(ans.begin(),ans.end());//ans排序
	for (int i=0;i<ans.size();i++) cout<<ans[i]<<endl;//输出
	return 0;
} 

今后要养成写注释的习惯,可以在发稿时写,DEC C++中文注释复制过来全是乱码,英文注释又怕大家看不明白

时间: 2024-08-29 15:22:21

【map练习】Uva156 - Ananagrams题解的相关文章

UVA156 Ananagrams

问题链接:UVA156 Ananagrams. 题意简述:输入一个文本文件,从中提取出一些单词输出,输出的单词按照文本文件中的原来样子输出(字母大小写不变).对于所有的单词,若字母不分大小写,单词经过重排顺序,与其他单词相同,这些单词则不在输出之列. 这个问题用C++语言编写程序,主要是为了练习使用STL的功能.另外一点,C++编写程序效率会更高. 程序中,使用了容器类map和vector.其他都是套路. AC的C++语言程序如下: /* UVA156 Ananagrams */ #includ

UVa-156 Ananagrams(map映射)

参考:https://blog.csdn.net/hoaresky1998/article/details/51351588 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <set> 5 #include <map> 6 #include <algorithm> 7 using namespace std; 8 map<stri

UVa156 Ananagrams (STL)

链接:http://acm.hust.edu.cn/vjudge/problem/19294分析:map容器的应用.map容器按key值从小到大排序,所以自定义类型作为key时要定义“小于”运算符,还有map重载“[]”运算符,可以像数组一样使用.将每个单词“标准化”(将字母转换成小写并按字典序从小到大),cnt记录每个“标准化”后单词的个数,words保存出现过的所有单词,最后遍历words数组,将“标准化”后只出现一次的单词保存最后按字典序排序后输出. 1 #include <iostrea

SPOJ ADAFIELD Ada and Field(STL的使用:set,multiset,map的迭代器)题解

题意:n*m的方格,"0 x"表示x轴在x位置切一刀,"0 y"表示y轴在y位置切一刀,每次操作后输出当前面积最大矩形. 思路:用set分别储存x轴y轴分割的点,用multiset(可重复)储存x轴y轴边,每次输出最大的长和最大的宽的积.题目可能重复切.multiset如果直接erase(13)会把所有的13都删掉,如果只想删一个则erase(multiset.find(13)).第一次知道set自带二分... 这里multiset也可以用map<int, i

UVa 156 - Ananagrams

 Ananagrams  Most crossword puzzle fans are used to anagrams--groups of words with the same letters in different orders--for example OPTS, SPOT, STOP, POTS and POST. Some words however do not have this attribute, no matter how you rearrange their let

map映射

map实例代码: 1 // UVa156 Ananagrams 2 // Rujia Liu 3 // 题意:输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排得到输入文本中的另外一个单词 4 // 算法:把每个单词“标准化”,即全部转化为小写字母然后排序,然后放到map中进行统计 5 #include<iostream> 6 #include<string> 7 #include<cctype> 8 #include<vector> 9 #i

STL语法——映射:map 反片语(Ananagrams,UVa 156)

Description Most crossword puzzle fans are used to anagrams--groups of words with the same letters in different orders--for example OPTS, SPOT, STOP, POTS and POST. Some words however do not have this attribute, no matter how you rearrange their lett

UVa 156 Ananagrams(STL,map)

 Ananagrams  Most crossword puzzle fans are used to anagrams--groups of words with the same letters in different orders--for example OPTS, SPOT, STOP, POTS and POST. Some words however do not have this attribute, no matter how you rearrange their let

PAT甲题题解-1095. Cars on Campus(30)-(map+树状数组,或者模拟)

题意:给出n个车辆进出校园的记录,以及k个时间点,让你回答每个时间点校园内的车辆数,最后输出在校园内停留的总时间最长的车牌号和停留时间,如果不止一个,车牌号按字典序输出. 几个注意点: 1.如果一个车连续多次进入,只取最后一个 2.如果一个车连续多次出去,只取第一个 3.一个车可能出入校园内好几次,停留时间取总和 实际上题目就是让我们求某个时间段内的车辆总和,时间段其实就相当于一个区间,区间求和的话,很快就联想到树状数组和线段树.然而怎么将时间段和区间联系起来呢,那就存储出现在记录和询问里的所有