UVA 165 multiset,map的用法

    xiaoxiao2022-07-04  167

    题意:给出一堆单词,问这些单词能否由其他单词的字母重新组合得到(不区分大小写),找出不能重新组合得到的,并按照字典序输出(区分大小写) 紫数的114页。 很难想到要把这些单词标准化,再看有无重复的。标准化就是先全部化为小写字母,再按字典序排序。 这题可以用map<string,int>来看是否有重复的,也可以用multist<string.> map:

    #include<iostream> #include<stack> #include<vector> #include<cstring> #include<algorithm> #include<string> #include<set> #include<map> using namespace std; map<string,int>cnt;//用map来查看是否重复 vector<string> word;//保存原来的单词 string stard(string x){ string ans=x; for(int i=0;i<ans.size();i++){ ans[i]=tolower(ans[i]);//全部换为小写字母 } sort(ans.begin(),ans.end());//string的排序 return ans; } int main() { string s; while(cin>>s){ if(s=="#")break; word.push_back(s);//先保存原来的单词 s=stard(s);//标注化 cnt[s]++;//加入map } set<string> st;//对输出的答案进行排序 for(int i=0;i<word.size();i++){ if(cnt[stard(word[i])]==1)st.insert(word[i]);//如果没有重复的 } set<string>::iterator ite;//用set可以自动排序 for(ite=st.begin();ite!=st.end();ite++){ cout<<*ite<<endl; } return 0; }

    multiset:

    #include<iostream> #include<stack> #include<vector> #include<cstring> #include<algorithm> #include<string> #include<set> #include<map> using namespace std; multiset<string>cnt;//唯一的区别,就是用multiset来看是否有重复的 vector<string> word; string stard(string x){ string ans=x; for(int i=0;i<ans.size();i++){ ans[i]=tolower(ans[i]); } sort(ans.begin(),ans.end()); return ans; } int main() { string s,t; while(cin>>s){ if(s=="#")break; word.push_back(s); s=stard(s); cnt.insert(s);//加入multiset中 } set<string> st; for(int i=0;i<word.size();i++){ t=stard(word[i]); int num=cnt.count(t);//有相同字母的单词出现的次数。 if(num==1)st.insert(word[i]); } set<string>::iterator ite; for(ite=st.begin();ite!=st.end();ite++){ cout<<*ite<<endl; } return 0; }
    最新回复(0)