https://vjudge.net/problem/UVA-156
题目大意:
输入文本,找出所有满足条件的单词——该单词不能通过字母重排而得到输入的文本中的另外一个单词。
在判断是否满足条件时,字母不分大小写,但在输出时应保留输入中的大小写,按字典序进行排序。
Sample Input
ladder came tape soon leader acme RIDE lone Dreis peat
ScAlE orb eye Rides dealer NotE derail LaCeS drIed
noel dire Disk mace Rob dries #
Sample Output
Disk
NotE
derail
drIed
eye
ladder
soon
将所有单词转为小写再sort后存入map中,若已出现过则继续加1,若未出现过则先赋零再加1
将所有单词原文本存入set中,会直接按字典序排序,最后遍历set 判断 输出

#include <bits/stdc++.h> using namespace std; map <string,int> mp; set <string> had; string judge(string str) { string s=str; for(int i=0;i<s.length();i++) s[i]=tolower(s[i]); ///将单词转为小写再排序 sort(s.begin(),s.end()); return s; } int main() { string str; while(cin>>str) { had.insert(str); ///将原文本单词存入set if(str[0]=='#') break; string temp=judge(str); if(mp.count(temp)==0) mp[temp]=0; mp[temp]++; ///转换后的单词是否出现过 无则赋零+1有则+1 } set <string>::iterator iter; for(iter=had.begin();iter!=had.end();iter++) if(mp[judge(*iter)]==1) cout<<*iter<<endl; ///为1表示没有重复只出现过一次 return 0; }