题意:对字符串分类,按照每类大小由大到小输出前五个类,没类中相同的字符串只输出一次。

题解:各种STL

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<queue>
 5 #include<string>
 6 #include<map>
 7 #include<set>
 8 using namespace std;
 9 struct data
10 {
11     vector<string> vec;
12 };
13 map<string,int> MP;
14 set<string> CO;
15 data po[50000];
16 bool comp(data a,data b)
17 {
18     int al=a.vec.size(),bl=b.vec.size();
19     if(al!=bl)
20         return al>bl;
21     else
22         return a.vec[0]<b.vec[0];
23 }
24 int main()
25 {
26     MP.clear();
27     char s[50];
28     int num=0,id;
29     while(gets(s))
30     {
31         char cs[50];
32         strcpy(cs,s);
33         sort(cs,cs+strlen(cs));
34         if(MP.find(cs)==MP.end())
35             id=MP[cs]=++num;
36         else
37             id=MP[cs];
38         po[id].vec.push_back(s);
39     }
40     for(int i=1;i<=num;i++)
41         sort(po[i].vec.begin(),po[i].vec.end());
42     sort(po+1,po+num+1,comp);
43     for(int i=1,k;i<=5&&i<=num;i++)
44     {
45         printf("Group of size %d:",k=po[i].vec.size());
46         for(int j=0;j<k;j++)
47         {
48             if(j>0&&po[i].vec[j]==po[i].vec[j-1])
49                 continue;
50             printf(" %s",po[i].vec[j].c_str());
51         }
52         printf(" .\n");
53     }
54     return 0;
55 }