**图灵杯 J** 简单的变位词

Description
变位词是指改变某个词的字母顺序后构成的新词。蔡老板最近沉迷研究变位词并给你扔了一道题:
给你一些单词,让你把里面的变位词分组找出来。互为变位词的归为一组,最后输出含有变位词最多的前五组。如果有组数相同的按照字典序输出。

Input
输入包含由小写字母组成的单词,用换行分割,被EOF终止。 输入数据不超过30000个单词。

Output
输出五组包含单词数量最多的变位词,如果少于五组,输出全部。对每组输出,写出它的大小和成员词,成员词按字典序排序用空格分隔,每组输出之间用换行分隔,相同词只输出一次,但算个数。

Sample Input
neuq
tea
bate
beat
caret
trace
nueq
carte
cater
crate
abet
ate
eat
beta
eta
signal
Sample Output
Group of size 5: caret carte cater crate trace .
Group of size 4: abet bate beat beta .
Group of size 4: ate eat eta tea .
Group of size 2: neuq nueq .
Group of size 1: signal .

这个题和字数上一个题差不多,又不太一样,紫书上那个题比这个简单…
我主要是不知道怎么样把互为变位词的归为一组.搜了搜网上的解题报告,感觉像是打开了新世界的大门︿( ̄︶ ̄)︿超棒的。而且他们大多数都是用哈希做的,可惜我还没学,等我学会了再来把那种做法补过来。

#include <cstdio>
#include <map>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>

using namespace std;

string s, ss;
map<string, int> p;
vector<string> data[31234];

bool cmp(vector<string> a, vector<string> b)
{
    if(a.size() != b.size())
        return a.size() > b.size();
    for(int i = 0; i < a.size(); i++)
    {
        if(a[i] != b[i])
            return a[i] < b[i];
    }
}

int main()
{
   int i, head = 1, j;
   while(cin >> s)
   {
       ss = s;
       sort(ss.begin(), ss.end());
       if(!p[ss])
       {
           p[ss] = head++;//不同于以往的p[ss]++, 他是把每一种的单词有一个编号, 我当时一直在想p[ss]++;
       }
       data[p[ss]].push_back(s);//这样就把互为变位词的归为了一组;
   }

   for(i = 1; i < head; i++)
   {
       sort(data[i].begin(), data[i].end());
       unique(data[i].begin(), data[i].end());
   }

   sort(data + 1, data + head, cmp);//这个排序也刷新的我的世界观;

   if(head > 5)
   {
       for(i = 1; i <= 5; i++)
       {
           printf("Grop of size %d: ", data[i].size());
           for(j = 0; j < data[i].size(); j++)
           {
               cout << data[i][j] << " ";
           }
           cout << '.' << endl;
       }
   }
   else
   {
       for(i = 0; i < head; i++)
       {
           printf("Grop of size %d: ", data[i].size());
           for(j = 0; j < data[i].size(); j++)
           {
               cout << data[i][j] << " ";
           }
           cout << '.' << endl;
       }
   }
   return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值