SDUT 3185 Lexicography(排列问题(不会))

Lexicography

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

An anagram of a string is any string that can be formed using the same letters as the original. (We consider the original string an anagram of itself as well.) For example, the string ACM has
the following 6 anagrams, as given in alphabetical order:

ACM
AMC
CAM
CMA
MAC
MCA

As another example, the string ICPC has the following 12 anagrams (in alphabetical order):

CCIP
CCPI
CICP
CIPC
CPCI
CPIC
ICCP
ICPC
IPCC
PCCI
PCIC
PICC

Given a string and a rank K, you are to determine the Kth such anagram according
to alphabetical order.

输入

Each test case will be designated on a single line containing the original word followed by the desired rank K.
Words will use uppercase letters (i.e., A through Z) and will have length at most 16.
The value of K will be in the range from 1 to the number of distinct anagrams of the given word. A line of the form "#
0
" designates the end of the input.

Warning: The value of K could be almost 245 in
the largest tests, so you should use type long in Java, or type long
long
 in C++ to store K.

输出

For each test, display the Kth anagram
of the original string.

示例输入

ACM 5
ICPC 12
REGION 274
# 0

示例输出

MAC
PICC
IGNORE

提示

来源

2014 ACM MId-Central Reginal Programming Contest(MCPC2014)

示例程序

#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<map>
#define LL long long
using namespace std;
LL a[20];
void init()
{   int i;
    a[0]=1;
    for(i=1;i<=17;i++)
    {
        a[i]=a[i-1]*i;
    }
}
string se(string str,LL  n)
{   int i;
    string s;
    map<int,int>st;
    int l=str.length();
    for(i=0;i<=l-1;i++)
    {
        st[str[i]-'A']++;
    }

    while(st.size())
    {
        l--;
        LL sum=0;
    for(map<int,int>::iterator it=st.begin();it!=st.end();it++)
    {
        LL ans=a[l]/a[it->second-1];
        for(map<int,int>::iterator j=st.begin();j!=st.end();j++)
        {
            if(it!=j)
            {
                ans=ans/a[j->second];
            }
        }
        if(sum+ans>=n)
        {
          s+=char(it->first+'A');
          it->second--;
          if(it->second==0)
          {
              st.erase(it);
          }
            n=n-sum;
            break;
        }
        sum+=ans;
    }
    }
    return s;
}
int main()
{
    init();
    string str;
      LL n;
    while(cin>>str>>n)
    {
        if(str=="#"&&n==0)
        {
            break;
        }
        cout<<se(str,n)<<endl;
    }
    return 0;
}
时间: 2024-10-02 08:00:17

SDUT 3185 Lexicography(排列问题(不会))的相关文章

Lexicography(数学推论&gt;&gt;求按字典序排第k个排列)

Lexicography Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu Submit Status Practice CSU 1563 Description An anagram of a string is any string that can be formed using the same letters as the original. (We consider the orig

sdut oj 1163 C语言实验——排列 (当初不会递归生成排列,这个题目现在才补上 刘汝佳给出了写法 *【模板】 当然有生成全排列的函数存在 )

C语言实验——排列 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 有4个互不相同的数字,请按序输出由其中三个不重复数字组成的排列. 输入 4个整数. 输出 所有排列,输出顺序见样例. 示例输入 1 2 3 4 示例输出 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 1 2 4 1 4 2 2 1 4 2 4 1 4 1 2 4 2 1 1 3 4 1 4 3 3 1 4 3 4 1 4 1 3 4

CSU 1563: Lexicography (数学计数问题)

1563: Lexicography Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 342  Solved: 111 [Submit][Status][Web Board] Description An anagram of a string is any string that can be formed using the same letters as the original. (We consider the original stri

字符串排列组合算法

第二个算法是我笔试题遇到的,当时没有做出来,在网上看到别人写的算法,感觉太精妙了,就在这里分享出来. 全排列 所谓全排列,就是打印出字符串中所有字符的所有排列.例如输入字符串abc,则打印出 a.b.c 所能排列出来的所有字符串 abc.acb.bac.bca.cab 和 cba . #include<stdio.h> #include<string.h> static int number=0; void Swap(char *a ,char *b) { char temp =

BZOJ 4517: [Sdoi2016]排列计数 错排+逆元

4517: [Sdoi2016]排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条件的序列可能很多,序列数对 10^9+7 取模. Input 第一行一个数 T,表示有 T 组数据. 接下来 T 行,每行两个整数 n.m. T=500000,n≤1000000,m≤1000000 Output 输出 T 行,每行一个数,表示

lintcode 中等题:next permutation下一个排列

题目 下一个排列 给定一个整数数组来表示排列,找出其之后的一个排列. 样例 给出排列[1,3,2,3],其下一个排列是[1,3,3,2] 给出排列[4,3,2,1],其下一个排列是[1,2,3,4] 注意 排列中可能包含重复的整数 解题 和上一题求上一个排列应该很类似 1.对这个数,先从右到左找到递增序列的前一个位置,peakInd 2.若peakInd = -1 这个数直接逆序就是答案了 3.peakInd>= 0 peakInd这个位置的所,和 peakInd 到nums.size() -1

HDU--5396(区间dp+排列组合)

做这道题的时候,想到会不会是dp,然后发现dp可做,但是一直被自己坑到死. 枚举最后合并的那个位置,然后对于加减号的,分成的前后两个部分都有不同的组合方法, (a1+a2........) +  (b1,b2.............)         对于每个a,被加b的个数的阶乘次 ,对于每个b,被加a的个数的阶乘次 减法同理 乘法特殊一点 (a1+a2........) *  (b1,b2.............)  乘法分配率,直接将两部分的总和相乘即可 想到这些还远远没有结束,因为最

字符串的排列

题目:输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. 思路: 我们以三个字符abc为例来分析一下求字符串排列的过程.首先我们固定第一个字符a,求后面两个字符bc的排列.当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第一个字符b,求后面两个字符ac的排列.现在是把c放到第一位置的时候了.记住前面我们已经把原先的第一个字符a和后面的b做了交

CSU 1555 Inversion Sequence 给出逆序数求排列 splay

题目链接:点击打开链接 题意: 给出逆序数的值,求原序列(一个1-N的排列) 1, 2, 0, 1, 0 表示1的逆序数是1,2的逆序数是2,3的逆序数是0··· 思路: 从最后一个数开始插,每次插到当前序列的第a[i]个数.. splay模拟 == 这个方法比较直(wu)观(nao),别的方法并没有想出来.. #include <cstdio> #include <iostream> #include <cstring> #include <queue>