百练:2408:Anagram Groups

Posted 地球太危险了

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了百练:2408:Anagram Groups相关的知识,希望对你有一定的参考价值。

1、解题思路

根据题意需要对一连串字符串进行分类,分类标准为最小字典序排列相同,则根据分类和输出标准可以构造一个结构体,结构体如下:

struct node
    set<string> s_set;
    string new_string;
    string old_first_string;
    int num;
s_node[30001];

1、其中s_set用于存储字符串,这里依照题目要求用了set的两个性质:1) 无重复元素 2)自动排序

2、其中num为这一类的总个数(注意总个数不一定等于最终这一类输出的个数,因为输出个数去除了相同元素)

3、new_string:为这一类的特征(按最小字典序排序后的字符串)

4、old_first_string:第一个存入set的字符串

除了构造结构体,为了方便查找字符串属于哪一个类,使用了map来将类特征(排序后的字符串)映射到类下标(数组下标)。

有了结构体后就可以对输入的每一个字符串进行排序,排完序使用map来查找s_node数组对应的类下标,若没有则开辟一个新类,有则更新。

2、源代码

#include <iostream>
#include <set>
#include <map>
#include <algorithm>
using namespace std;
struct node
	set<string> s_set;
	string new_string;
	string old_first_string;
	int num;
s_node[30001];
map<string, int> s_i;
bool cmp(node x, node y)
	if(x.num == y.num)
		return x.old_first_string < y.old_first_string;
	return x.num > y.num;

int main ()
	int Total = 0;
	string temp;
	while(cin>>temp)
		string y = temp;
		sort(temp.begin(), temp.end());
		if(s_i.find(temp) == s_i.end())  // 无对应map则创建一个新node
			s_i[temp] = Total; 
			s_node[Total].num++;
			s_node[Total].new_string = temp;
			s_node[Total].old_first_string = y;
			s_node[Total].s_set.insert(y);
			Total++; 
		else  // 有对应map则存入对应的node的set中并且字符串数量+1 
			s_node[s_i[temp]].num++;
			s_node[s_i[temp]].s_set.insert(y);
		
	
	sort(s_node, s_node+Total, cmp);  // 按数量+字典序排序 
	for(int i = 0 ; i < 5; i++)  // 取前五个输出 
		if(s_node[i].num == 0)
			break;
		cout<<"Group of size "<<s_node[i].num<<": ";
		for(set<string>::iterator it = s_node[i].s_set.begin(); it != s_node[i].s_set.end(); ++it) 
			cout<<*it<<" ";		
		
		cout<<"."<<endl;
	
	return 0;
 

以上是关于百练:2408:Anagram Groups的主要内容,如果未能解决你的问题,请参考以下文章

poj 2408 Anagram Groups

POJ 2408 - Anagram Groups - [字典树]

百练:2181:Jumping Cows

百练:2181:Jumping Cows

ACM/ICPC 之 递归(POJ2663-完全覆盖+POJ1057(百练2775)-旧式文件结构图)

源哥每日一题第十三弹 百练4124:海贼王之伟大航路 状压dp