Description
Input
Output
Sample Input
undisplayed trace tea singleton eta eat displayed crate cater carte caret beta beat bate ate abet
Sample Output
Group of size 5: caret carte cater crate trace . Group of size 4: abet bate beat beta . Group of size 4: ate eat eta tea . Group of size 1: displayed . Group of size 1: singleton .
Source
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <set> #define MAX 30001 using namespace std; struct group { int num; set<string> gr; group() { num = 0; } }g[MAX]; int trie[MAX * 100][26],to[MAX * 100]; int pos,num; int snum[26]; bool cmp(const group &a,const group &b) {///注意这里 if(a.num == b.num) return *(a.gr.begin()) < *(b.gr.begin()); return a.num > b.num; } void Insert(char *s) { int len = strlen(s); string s1 = s; string s2 = ""; for(int i = 0;s[i];i ++) { snum[s[i] - ‘a‘] ++; } for(int i = 0;i < 26;i ++) { while(snum[i]) { s2 += ‘a‘ + i; snum[i] --; } } int i = 0,c = 0; while(i < len) { int d = s2[i] - ‘a‘; if(!trie[c][d]) trie[c][d] = ++ pos; c = trie[c][d]; i ++; } if(!to[c]) to[c] = ++ num; g[to[c]].gr.insert(s1) ; g[to[c]].num ++; } int main() { char str[100]; while(~scanf("%s",str)) { Insert(str); } sort(g + 1,g + 1 + num,cmp); for(int i = 1;i <= 5;i ++) { printf("Group of size %d:",g[i].num); for(set<string>::iterator it = g[i].gr.begin();it != g[i].gr.end();it ++) { printf(" %s",(*it).c_str()); } puts(" ."); } }
原文:https://www.cnblogs.com/8023spz/p/9629787.html