http://write.blog.csdn.net/mdeditor
#include <stdio.h> #include <algorithm> #include <iostream> #include <string.h> #define maxs 100010 #define MME(i,j) memset(i,j,sizeof(i)) using namespace std; struct input { char primary[40];//输入的初始字符串 char sort_word[40];//排序好的字符串 }f[30500]; int input_cmp(input a,input b) { if( !strcmp(a.sort_word,b.sort_word) ) return strcmp(a.primary,b.primary)<0; else return strcmp(a.sort_word,b.sort_word)<0; } struct group { char primary[40];//存放的是初始的字符串 int num; //sort之后出现次数 int begins; //这个串出现的起始位置 }G[30020]; int groupcmp(group a,group b) { if(a.num==b.num) return strcmp(a.primary,b.primary)<0; else return a.num>b.num; } int main() { int k=0; while(~scanf("%s",f[k].primary)) { int len=strlen(f[k].primary); strcpy(f[k].sort_word,f[k].primary); sort(f[k].sort_word,f[k].sort_word+len); k++; } sort(f,f+k,input_cmp); strcpy(G[0].primary,f[0].primary); G[0].num=1; G[0].begins=0; int groupnum=1; for(int i=1;i<k;i++) { if( strcmp(f[i].sort_word,f[i-1].sort_word)==0 ) G[groupnum-1].num++; else { G[groupnum].num=1; strcpy(G[groupnum].primary,f[i].primary); G[groupnum].begins=i; groupnum++; } } sort(G,G+k,groupcmp); /*for(int i=0;i<k;i++) printf("Primary is %s size is %d\n",G[i].primary,G[i].num); puts("");*/ int pos; for(int i=0;i<5;i++) { printf("Group of size %d:",G[i].num); pos=G[i].begins; bool flag=0; for(int j=0;j<G[i].num;j++) { flag=0; for(int k=j-1;k>=0;k--) { if(strcmp(f[k].primary,f[j].primary)==0)//初始一样的字符串只输出一次 { flag=1; break; } } if(!flag) printf(" %s",f[j+pos].primary); } puts(" ."); //puts( f[G[i].num-1].primary ); } return 0; }