题解 P1808 【单词分类_NOI导刊2011提高(01)】

大家用的方法都太好了!!
蒟蒻小金羊来发一篇玄学堆排。
STL大法好
(附有核心code详解,完整code)


核心:两次排序,第一次自我排序,第二次整体排序。

核心code1:

string strsort(string str)
{
	int len=str.size();
	for (int temp=0;temp<len;temp++)
	{
		q2.push(str[temp]);
	}
	string str2="";
	for (int temp=0;temp<len;temp++)
	{
		char tempchar=q2.top();
		str2=str2+tempchar;
		q2.pop();
	}
	return str2;
}

解释:

这个函数就是用来自我排序的函数,
把字符串的字符抽出来,放进优先队列(小根堆)中
利用小根堆自我维护的功能(自动排序),
再从小根堆里抽出来合成一个新的排好序的字符串返回。


核心code2:

int main()
{
	/*以上都不是核心*/
	for (int i=1;i<=n;i++)
	{q1.push(strs[i]);}
	string strtemp=q1.top();q1.pop();
	for (int i=1;i<n;i++)
	{
		string temp=q1.top();q1.pop();
		if (temp!=strtemp){count++;}
		strtemp=temp;
	}
	/*以下都不是核心*/
}

解释:

利用自我维护,往小根堆里放,再拿出来,
如果和上一次拿出来的不一样,类别count就++。


Entire code:

#include <iostream>//不想OI一场空,千万别用万能头 
#include <cstdio>//能不用cin就不用 
#include <queue>//优先队列
#include <string>
#include <cstring>
//不在OI的同学请用#include <bits/stdc++.h>
using namespace std;
priority_queue<string,vector<string>,greater<string> >q1;
priority_queue<char,vector<char>,greater<char> >q2;
//由于小金羊不会其他排序,发一个堆排吧...
//话说字符串堆排是不是太玄学了...
//其实原理极其简单,入堆,出堆,返回,搞定。
//然后做一个字符串的整体的堆排,就OK了。 
int n,count=1;
//整体变量
string strsort(string str)
{//字符串堆排,真玄学 
	int len=str.size();
	for (int temp=0;temp<len;temp++)
	{
		q2.push(str[temp]);
	}
	string str2="";//把要生成的字符串变成空的 
	for (int temp=0;temp<len;temp++)
	{
		char tempchar=q2.top();
		str2=str2+tempchar;
		q2.pop();
	}//生成完毕 
	return str2;//返回排好序的字符串 
}
int main()
{
	scanf("%d",&n);
	if (n==1){putchar('1');return 0;}
	//一个字符串还能有多少种啊 
	string strs[n+1];
	//第一个字符串就不要了 
	for (int i=1;i<=n;i++)
	{cin>>strs[i];strs[i]=strsort(strs[i]);}
	//输入,并且对单个字符串排序 
	for (int i=1;i<=n;i++)
	{q1.push(strs[i]);}
	string strtemp=q1.top();q1.pop();
	for (int i=1;i<n;i++)
	{
		string temp=q1.top();q1.pop();
		if (temp!=strtemp){count++;}
		strtemp=temp;
	}
	printf("%d",count);
	return 0;
}

这个题也可以sort,sort,也可以mergesort,mergesort
Thanks for your watching.
No copying for a better www.luogu.com.

原文地址:https://www.cnblogs.com/jelly123/p/10385908.html