uvaoj 156Ananagrams(map和vector组合使用)

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=92

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

并将这些输出的单词按字典序顺序排列

map的count方法,如果map里面有这个元素就返回1,否则返回0.

vector的push_back()在尾部添加元素   

这题还可以学习的是对每个单词进行标准化的技巧:变成小写的字典序排列,那么如果有能通过字母重排得到的单词,他们就是一样的。在这道题里非常容易判断。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 map<string,int>cnt;
 4 vector<string>words;
 5 //将单词标准化(变成小写的字典序)
 6 string repr(const string& s)
 7 {
 8     string ans=s;
 9     for(int i=0; i<ans.length(); i++)
10     {
11         ans[i]=tolower(ans[i]);
12     }
13     sort(ans.begin(),ans.end());//string类型可以用begin和end
14     return ans;
15 }
16 int main()
17 {
18     string s;
19     while(cin>>s)
20     {
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     {
30         if(cnt[repr(words[i])]==1)ans.push_back(words[i]);
31         
32     }
33     sort(ans.begin(),ans.end());
34     for(int i=0;i<ans.size();i++)
35     {
36         cout<<ans[i]<<endl;
37     }
38     
39     return 0;
40 }
View Code
原文地址:https://www.cnblogs.com/fqfzs/p/9966065.html