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 }