poj 2408 Anagram Groups(hash)

poj 2408 Anagram Groups(hash)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

题目链接:poj 2408 Anagram Groups

题目大意:给定若干个字符串,将其分组,依照组成元素同样为一组,输出数量最多的前5组,每组依照字典序输出所

有字符串。数量同样的输出字典序较小的一组。

解题思路:将全部的字符串统计字符后hash。排序之后确定每组的个数而且确定一组中字典序最小的字符串。依据个数

以及字符串对组进行排序。

#include <cstdio>
#include <cstring>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

const int maxn = 30005;
const int maxm = 30;
const int X = 30;
typedef unsigned long long ll;
typedef pair<ll,int> pii;

int N, M, E;
vector<pii> vec, grop;
vector<int> g[maxn];
char word[maxn][maxm], st[maxn][maxm];

inline ll Hash(char* s) {
    int len = strlen(s), c[maxm];
    memset(c, 0, sizeof(c));

    for (int i = 0; i < len; i++)
        c[s[i]-'a']++;

    ll ret = 0;
    for (int i = 0; i < 26; i++)
        ret = ret * X + c[i];
    return ret;
}

inline bool cmp (const pii& a, const pii& b) {
    if (a.second == b.second)
        return strcmp(st[a.first], st[b.first]) < 0;
    return a.second > b.second;
}

inline bool sort_by(const int& a, const int& b) {
    return strcmp(word[a], word[b]) < 0;
}

int main () {
    N = M = E = 0;
    vec.clear();
    grop.clear();

    while (scanf("%s", word[N]) == 1) {
        ll key = Hash(word[N]);
        vec.push_back(make_pair(key, N));
        N++;
    }
    sort(vec.begin(), vec.end());

    int cnt = 0;
    ll pre = -1;

    for (int i = 0; i < vec.size(); i++) {
        int idx = vec[i].second;
        if (vec[i].first != pre) {
            if (cnt)
                grop.push_back(make_pair(M++, cnt));
            cnt = 0;
            g[M].clear();
            pre = vec[i].first;
            strcpy(st[M], word[idx]);
        }

        cnt++;
        g[M].push_back(idx);
        if (strcmp(word[idx], st[M]) < 0)
            strcpy(st[M], word[idx]);
    }

    if (cnt)
        grop.push_back(make_pair(M++, cnt));
    sort(grop.begin(), grop.end(), cmp);

    for (int i = 0; i < min(5, (int)grop.size()); i++) {
        printf("Group of size %d: ", grop[i].second);
        int x = grop[i].first;
        sort(g[x].begin(), g[x].end(), sort_by);
        for (int j = 0; j < g[x].size(); j++) {
            if (j == 0 || strcmp(word[g[x][j-1]], word[g[x][j]]))
                printf("%s ", word[g[x][j]]);
        }
        printf(".\n");
    }
    return 0;
}

版权声明:本文博客原创文章。博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117633.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C++字符串流stringstream与string知识介绍与用法小结

    C++字符串流stringstream与string知识介绍与用法小结之前总结了C++的文件输出输入流的相关知识,通过介绍底层的streambuf缓冲区,从而与stringstream流(字符串流)联系了起来,本文就对此进行简单的介绍。首先介绍string。string是C++提供的字符串类,和C类型的字符串相比,除了有不限长度的优点外,还有其他许多方便的功能,其可以看成类似STL里vector数组的一种容器,可以方便的进行数据的增删改查,并可以进行…

    2022年6月10日
    34
  • QPainter::drawImage的用法说明

    QPainter::drawImage的用法说明Qt 帮助文档里的函数声明 voidQPainter drawImage constQRect amp target constQImage amp image constQRect amp source Qt ImageConvers Qt AutoColor 举例 QRecttarget 10 0 20 0 80 0

    2025年6月23日
    4
  • python QQ刷屏代码[通俗易懂]

    python QQ刷屏代码[通俗易懂]这个代码只能支持一个窗口进行刷屏,name变量是窗口名,foriinrange(1):括号中的数字是发送数量,由于是初学python如有不足请大佬们指教fromunicodedataimportnameimportwin32guiimportwin32conimportwin32clipboardaswclassqqshuapin:defsend(self,msg):name=”我的Android手机”w.OpenClipboard(

    2022年4月27日
    285
  • 七牛云大数据平台建设实践

    七牛云大数据平台建设实践七牛云CEO许式伟首次披露七牛云在大数据方向的产品思路。

    2022年6月9日
    29
  • 中国银行笔试题目回忆录_中国银行好考吗

    中国银行笔试题目回忆录_中国银行好考吗亲,戳上面的蓝字关注我们哦!中国银行笔试回忆题目昨天刚考完的中国银行笔试题目,趁着头脑还比较清醒先在这里记录一下吧,我选的是中国银行的信息技术岗位。我是提前就进了考场,中国银行考场还是比较好的,还

    2022年8月3日
    14
  • Java 工厂模式

    Java 工厂模式简单工厂模式详解简单工厂模式用来定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态方法,因此简单工厂模式又被称为静态工厂方法模式,它属于类创建型模式。简单工厂模式的要点在于,当我们需要什么,只需要传入一个正确的参数,就可以获取我们所需要的对象,而无需知道其创建细节。简单工厂模式结构比较简单,其核心是工厂类的设计,其机构如图所示:在简单工厂模式结构图中包含如下几个角色。Factory(工厂角色):工厂角色即工厂类,它

    2022年7月20日
    21

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号