• 题解 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.

  • 相关阅读:
    Unable to load configuration.
    Hibernate映射文件如何配置触发器
    hibernate的集中持久化方法的区别
    Hibernate.lock()方法中各种锁的区别
    JNDI全面总结
    代理模式
    Java常见的几种内存溢出及解决方法
    Hibernate整合C3P0实现连接池
    Hibernate与Mybatis的概念区别
    sql之truncate 、delete与drop区别
  • 原文地址:https://www.cnblogs.com/jelly123/p/10385908.html
Copyright © 2020-2023  润新知