UVa156

题意:

输入一些单词,找出所有满足以下条件的单词:该单词不能通过字母重排得到输入文本中的另外一个单词。在判断是否满足条件时,字母不区分大小写,但在输出时应该保留输入中的大小写,按字典序进行排列。

分析:

将输入的单词进行“标准化”,即将单词中的每个字母化为小写并按字典序重排单词,用一个字典来统计一个标准化的单词出现过多少次,输出的时候只输出在标准字典中出现一次的那些单词即可。

 1 #include <iostream>
 2 #include <string>
 3 #include <map>
 4 #include <vector>
 5 #include <algorithm>
 6 using namespace std;
 7 // 将单词进行标准化
 8 string repr(const string& s){
 9     string ans = s;
10     for(int i = 0 ; i < ans.length() ; i++)
11         ans[i] = tolower(ans[i]);
12     sort(ans.begin(),ans.end());
13     return ans;
14 }
15 vector<string> words;
16 map<string,int> cnt;
17 int main(){
18     int n = 0;
19     string s;
20     while(cin >> s){
21         if(s[0] == ‘#‘) break;
22         words.push_back(s);
23         string r = repr(s);
24         if(!cnt.count(r)) cnt[r] = 0;
25         cnt[r]++;
26     }
27     vector<string> ans;
28     for(int i = 0 ; i < words.size() ; i++)
29         if(cnt[repr(words[i])] == 1) ans.push_back(words[i]);
30     sort(ans.begin(),ans.end());
31     for(int i = 0 ; i < ans.size() ; i++)
32         cout << ans[i] << endl;
33     return 0;
34 }

时间: 2024-11-07 12:52:19

UVa156的相关文章

UVA156 Ananagrams

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

uva156反片语

背景:学习stl过程中遇到的简单题,但我不会. 思路:将单词标准化,然后就可以运用映射map了. #include <iostream> #include <string> #include <cctype> #include <vector> #include <map> #include <algorithm> using namespace std; map<string,int> cnt; vector<st

UVa156 Ananagrams (STL)

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

uva156 By sixleaves

1 #include <iostream> 2 #include <string> 3 #include <algorithm> 4 #include <map> 5 #include <vector> 6 using namespace std; 7  8 map<string, int> cnt; 9 vector<string> words;10 11 string formatWord(const string &

数据结构之map UVa156

1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 #include <vector> 6 #include <map> 7 8 using namespace std; 9 10 map<string,int> arr; 11 vector<string> word; 12 13 str

【map练习】Uva156 - Ananagrams题解

今后,日常学习栏目中将专注于新知识本身的探讨,辅助练习题目如果关联不大就会放在基础练习中. 题意:要你找出这样的单词,单词里面的字母不区分大小写,然后字母重排之后只出现一次的单词,找出之后,还是输入的样子以字典序输出 读了ruka上的标程后,自己写了一遍,代码如下: #include<iostream> #include<cstdio> #include<string> #include<map> #include<vector> #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

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