我用的是map,首先按照字母出现次数把各个单词分类,然后排序输出.
注意的是如果某个单词出现两次以上,那么输出组大小的时候也要算进去,但是输出单词是时候只能输出一次这个单词.
#include <iostream>
#include <cstdio>
#include <memory.h>
#include <string>
#include <map>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;
char buf[500];
map<map<int,int>,vector<string> >s;
vector<vector<string> >ans;
bool cmp(const vector<string>&v1,const vector<string>&v2){
return v1.size()>v2.size()||(v1.size()==v2.size()&&v1<v2);
}
int main(){
while ( scanf("%s",buf)!=EOF){
map<int,int>cnt;
int len=strlen(buf);
for (int i=0;i<len;++i){
cnt[buf[i]]++;
}
s[cnt].push_back(string(buf));
}
map<map<int,int>,vector<string> >::iterator it=s.begin();
for (;it!=s.end();++it){
sort(it->second.begin(),it->second.end());
ans.push_back(it->second);
}
sort(ans.begin(),ans.end(),cmp);
int acnt=5;
for (int i=0;acnt&&i<ans.size();++i,--acnt){
printf("Group of size %d:",ans[i].size());
ans[i].erase(unique(ans[i].begin(),ans[i].end()),ans[i].end());
for (int j=0;j<ans[i].size();++j){
printf(" %s",ans[i][j].c_str());
}
printf(" .\n");
}
return 0;
}