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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 关于JS全局变量问题

    关于JS全局变量问题最近在easyui使用全局变量的时候老是执行if判断语句,而不执行顺序下来的局部赋值。导致老是提示undefined;经网上查询得知JS全局变量时:当全局变量跟局部变量重名时,局部变量的scope会覆盖掉全局变量的scope,当离开局部变量的scope后,又重回到全局变量的scope。Javascript的变量的scope是根据方法块来划分的(也就是说以function的一对大括号{}来划分

    2022年6月3日
    35
  • webstrom格式化代码和常用的快捷键[通俗易懂]

    webstrom格式化代码和常用的快捷键[通俗易懂]在使用webstorm的时候,需要用到一些快捷键。 今天我就遇到以一个问题,就是我用java生成的html文档是不规范的,但是我需要将文档规范化排查一些问题。 1、打开webstrom。 2、File->Setting 3、搜索keyMap,进入keyMap设置页面,选择Eclipse方式。  如下图所示:           

    2022年5月4日
    148
  • 学会用 Mysql show processlist 排查问题

    学会用 Mysql show processlist 排查问题

    2022年2月12日
    46
  • java学生成绩管理系统

    java学生成绩管理系统/**@——环创移动端课后作业——*@copyrightbylzyon2016/4/12.*@name:java学生成绩管理系统.*@功能:学生相关信息,录入,查询,统计,修改等….*@PS:图形界面的学生管理系统不要求就不做了.*/importjava.util.Scanner;importjava.lang.*;importja

    2022年7月13日
    19
  • 市场上Web 应用防火墙哪家好?

    市场上Web 应用防火墙哪家好?伴随着移动互联网及互联网的发展,办公自动化也成为大势所趋。当企业通过网络办公获得无限便利后,也要时刻关注潜在的网络安全威胁。为了保护数据安全,更多企业都会配备Web应用防火墙设备。在市场上的Web应用防火墙产品应用中,被Gartner魔力象限评为Web应用防火墙领导者的F5公司的产品受到了广泛的关注与好评。 F5被Gartner魔力象限评为Web应用防火墙领导者F5推出的WEB应用防…

    2022年5月5日
    36
  • 织梦dede如何去除Power by DedeCms

    织梦dede如何去除Power by DedeCms自从dedecms织梦系统更新到6.7日的版本,底部版权信息调用标签{dede:global.cfg_powerby/}会自动加上织梦官方的链接[Power by DedeCms ],想必很多新用户使用中都想去除这个官方的链接,由于这是官方的作为,本文只是提供一个技术的交流,并不鼓励大家去除底部的链接。好了,回归正题,大家知道,进入后台在后台的系统-系统参数有个网站版权信息,在这里并不能找到官方的

    2022年7月15日
    14

发表回复

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

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