http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2316
理解错一点题意就能WA到死。。。题中对于重复的单词,只输出一个,但是重复的单词个数要加上
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <string> 5 #include <algorithm> 6 #include <vector> 7 #include <map> 8 using namespace std; 9 const int N=100010; 10 int vis[N]; 11 vector<string>v[N]; 12 map<string,int>mp; 13 struct node 14 { 15 int Size; 16 int num; 17 friend bool operator < (node a,node b) 18 { 19 if (a.Size == b.Size) 20 { 21 return v[a.num][0] < v[b.num][0]; 22 } 23 return a.Size > b.Size; 24 } 25 } G[N]; 26 int main() 27 { 28 string s[N],s2[N]; 29 char ss[N]; 30 int i = 0; 31 mp.clear(); 32 while(scanf("%s",ss)!=EOF) 33 { 34 if(ss[0]=='0') 35 break; 36 mp[ss]++; 37 if(mp[ss]==1) 38 { 39 s[i] = ss; 40 sort(ss,ss+strlen(ss)); 41 s2[i++] = ss; 42 } 43 } 44 int n = i; 45 int p = 0; 46 memset(vis,0,sizeof(vis)); 47 for (int j = 0; j < n; j++) 48 { 49 if (vis[j]) 50 continue; 51 int Size = 0; 52 for (int k = j; k < n; k++) 53 { 54 if (s2[j]==s2[k]) 55 { 56 vis[k] = 1; 57 v[p].push_back(s[k]); 58 if(mp[s[k]]>1) 59 Size+=mp[s[k]]-1; 60 } 61 } 62 G[p].Size = v[p].size()+Size; 63 G[p].num = p; 64 sort(v[p].begin(),v[p].end()); 65 p++; 66 } 67 sort(G,G+p); 68 if (p > 5) 69 p = 5; 70 for (int j = 0; j < p; j++) 71 { 72 printf("Group of size %d:",G[j].Size); 73 for (int k = 0; k < v[G[j].num].size(); k++) 74 { 75 cout<<" "<<v[G[j].num][k]; 76 } 77 printf(" .\n"); 78 } 79 return 0; 80 }