#include <bits/stdc++.h>
using namespace std;
string tranfer(string data)
{
string data_copy;
data_copy=data;//可以直接复制,也可以直接赋值string a=b;
for(int i=0;i<data.length();i++){
//if(isalpha(data[i])==1) 不能加这个判断,因为题目中说可能有数字,那么条件为假,这个数不被赋值给data_copy,后面的程序会出错,假设题目中没有说有数字,为了程序的鲁棒性在题目没有特殊要求的情况下也不应该加一个判断
data_copy[i]=tolower(data[i]);//tolower对非字符和小写字母不做处理
}
sort(data_copy.begin(),data_copy.end());//对于一串string的内部排序,1可以用sort,2用begin(),end(),表示起始位置、
return data_copy;
}
int main()
{
map<string,int> data_map;
vector<string> data_vector,data_vector2;//vector仅仅利用它不定长存储的特点,来看存了多少
set<string> data_set;//由于红黑树节点存储的原因,往里插入数据时会由小到大按ASCⅡ码排序
string data;
while(cin>>data){//scanf("%s",data)&&data!="#",用scanf读入string需要预先分配空间,string a;a.resize(100);scanf("%s",&a[0]);
if(data=="#")
break;
string data_copy=tranfer(data);
if(data_map.count(data_copy)==0) data_map[data_copy]=0;//这句加不加都可以(选手们思维方式不同),因为只要映射进map一次,其映射的值默认就是0。只有下面一句话既可,既将未加入map的数据加入map,又使已经出现过的数据的映射值加1。
data_map[data_copy]++;
data_vector.push_back(data);
}
//下面,装入set里自动排序,或者push_back装入一个新的vector,然后sort
// 1)
for(int i=0;i<data_vector.size();i++){
if(data_map[tranfer(data_vector[i])]==1)
data_vector2.push_back(data_vector[i]);
}
sort(data_vector2.begin(),data_vector2.end());
for(int i=0;i<data_vector2.size();i++){
cout<<data_vector2[i]<<endl;
}
/* 2)
for(int i=0;i<data_vector.size();i++){
if(data_map[tranfer(data_vector[i])]==1)
data_set.insert(data_vector[i]);
}
for(set<string>::iterator it=data_set.begin();it!=data_set.end();++it){
cout<<*it<<endl;
}
*/
return 0;
}